「数据结构」二叉搜索树1:实现BST

🎇个人主页:Ice_Sugar_7
🎇所属专栏:Java数据结构
🎇欢迎点赞收藏加关注哦!

实现BST

  • 🍉二叉搜索树的性质
  • 🍉实现二叉搜索树
    • 🍌插入
    • 🍌查找
    • 🍌删除
  • 🍉性能分析

🍉二叉搜索树的性质

二叉搜索树又称二叉排序树,它可以是一棵空树,也可以是有以下性质的二叉树

  • 若左子树不为空,则左子树上所有节点的值都小于根节点的值
  • 若右子树不为空,则右子树上所有节点的值都大于根节点的值
  • 它的左右子树也分别为二叉搜索树

因为左节点 < 根节点 < 右节点,所以二叉搜索树中序遍历结果是升序序列

🍉实现二叉搜索树

🍌插入

插入成功返回true,插入失败返回false
(注意:如果树中已经有关键字key,那我们就不能再插入了)

    //插入一个关键字keypublic boolean insert(int key) {TreeNode node = new TreeNode(key);if(root == null) {root = node;return true;}TreeNode cur = root;TreeNode parent = null;  //保存cur的双亲节点while(cur != null) {  //cur若为空,说明找到插入位置了if(cur.key < key) {parent = cur;cur = cur.right;} else if(cur.key > key) {parent = cur;cur = cur.left;} else {  //树中已经有key,不能插入return false;}}//比较key和双亲节点的key,确定key要插在parent的左边还是右边if(key > parent.key)parent.right = node;if(key < parent.key)parent.left = node;return true;}

🍌查找

根据二叉搜索树的特点,key比当前节点的值小,就往左子树找;反之则往右子树找

    //查找key是否存在public TreeNode search(int key) {if(root == null)return null;TreeNode cur = root;while(cur != null) {if(cur.key < key) {cur = cur.right;} else if(cur.key > key) {cur = cur.left;} else {return cur;}}return null;  //到这里说明找不到,返回null}

🍌删除

这个操作比较麻烦,因为它需要处理多种情况。大方向上分为三种情况讨论:
假设根节点为root,待删除节点是cur,它的双亲节点为parent

  1. cur的左节点为空
    ①cur就是根节点(此时parent不存在),只需让root = root.right
    ②cur不是根节点,是parent的左节点
    ③cur不是根节点,是parent的右节点
    ②和③的分析如下图:
    在这里插入图片描述

  2. cur的右节点为空
    这个和1的分析思路是一样的,就不多赘述了

  3. cur的左右节点都不为空
    使用替换法进行删除:
    就是从cur的左子树中找到最右侧的节点(这个节点是左子树中关键字最大的)max,或者从右子树中找到最左侧节点(关键字最小)min,用它的值替换掉cur的值,然后再把max或min删掉
    其实就是转化为1和2的问题,因为max和min的左节点和右节点肯定有一个为空
    在这里插入图片描述
    来看下代码实现:

    //删除key的值public boolean remove(int key) {if(root == null)return false;TreeNode cur = root;TreeNode parent = null;while(cur != null) {if(cur.key < key) {parent = cur;cur = cur.right;} else if(cur.key > key) {parent = cur;cur = cur.left;} else {  //找到cur了,准备把它删了if(cur.left == null) {if(cur == root) {root = root.right;return true;} else {if(cur == parent.left)parent.left = cur.right;if(cur == parent.right)parent.right = cur.right;}} else if(cur.right == null) {if(cur == root) {root = root.left;return true;} else {if(cur == parent.left)parent.left = cur.left;if(cur == parent.right)parent.right = cur.left;}} else {  //左右都不为空TreeNode target = cur.right;  //让target去右子树找到最左边的节点TreeNode targetParent = cur;while(target.left != null) {targetParent = target;target = target.left;}//将tmp的关键字赋给curcur.key = target.key;//删除tmp节点if(targetParent.left == target) {targetParent.left = cur.right;} else {targetParent.right = cur.right;}}return true;}}return false;}

🍉性能分析

插入和删除等操作都必须先查找,所以查找的效率代表二叉搜索树中各个操作的性能
每次查找都要比较key和当前节点的值。
那么在最好的情况下,二叉搜索树是完全二叉树,平均比较次数是logN
而在最坏的情况下,此时二叉搜索树退化为单支树,平均比较次数就是N / 2
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/466830.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中国电子学会2019年3月份青少年软件编程Scratch图形化等级考试试卷三级真题(选择题、判断题)

一、单选题(共 25 题&#xff0c;每题 2 分&#xff0c;共 50 分) 1. 要使以下代码运行后画出如图所示三角形风车,则以下代码中①②③④处应分别填入多少?( ) A.3 4 90 120 B.4 3 90 120 C.3 4 120 90 D.4 3 120 90 2.运行下列脚本&#xff0c;i的值为&#xff08; &am…

ChatGPT高效提问—prompt实践

ChatGPT高效提问—prompt实践 ​ 探索prompt在实际生活中的各种应用&#xff0c;旨在帮助理解和掌握如何将之前学到的prompt基础和技巧应用到具体实践中&#xff0c;从而在各个领域实现人工智能的价值。 ​ 通过生动的案例&#xff0c;发现并挖掘ChatGPT和prompt的无穷潜力。…

搜索专项---最短路模型

文章目录 迷宫问题武士风度的牛抓住那头牛 一、迷宫问题OJ链接 本题思路:只需要记录各个点是有哪个点走过来的&#xff0c;就能递推得出路径。记录前驱假设从 1,1 这个点向下走到了2, 1&#xff0c;则将2,1这个点的前驱记为1,1。这样&#xff0c;将整张地图 bfs 后&#xff0c…

LabVIEW智能温度监控系统

LabVIEW智能环境监测系统 介绍了一个基于LabVIEW的智能环境监测系统的开发过程。该系统在实时监测和分析环境参数&#xff0c;如温度、湿度、气体浓度等&#xff0c;以提供精确的数据支持&#xff0c;确保环境安全与健康。通过高效的数据处理和友好的用户界面&#xff0c;系统…

C++联合体详解!

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 大家伙新年快乐&#xff0c;今天我们来了解一下C联合体。 文章目录 1.联合体 1.1联合体的概念 1.2联合体的思想 1.3联合体的作用 1.3.1内存优化 1.3.2二进制数据操作 1.3.3类型转换 1.3.4解决特定问…

人脸追踪案例及机器学习认识

1.人脸追踪机器人初制 用程序控制舵机运动的方法与机械臂项目完全相同。 由于摄像头的安装方式为上下倒转安装&#xff0c;我们在编写程序读取图像时需使用 flip 函数将 图像上下翻转。 现在&#xff0c;只需要使用哈尔特征检测得到人脸在图像中的位置&#xff0c;再指示舵机运…

BUUCTF-Real-[Jupyter]notebook-rce

1、简介 Jupyter Notebook&#xff08;此前被称为 IPython notebook&#xff09;是一个交互式笔记本&#xff0c;支持运行 40 多种编程语言。 如果管理员未为Jupyter Notebook配置密码&#xff0c;将导致未授权访问漏洞&#xff0c;游客可在其中创建一个console并执行任意Pytho…

《UE5_C++多人TPS完整教程》学习笔记2 ——《P3 多人游戏概念(Multiplayer Concept)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P3 多人游戏概念&#xff08;Multiplayer Concept&#xff09;》 的学习笔记&#xff0c;该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版&#xff0c;UP主&#xff08;也是译…

研究多态恶意软件,探讨网络安全与AI

前言 近期ChatGPT火遍全球&#xff0c;AI技术被应用到了全球各行各业当中&#xff0c;国内外各大厂商也开始推出自己的ChatGPT&#xff0c;笔者所在公司在前段时间也推出了自研的安全GPT&#xff0c;AI技术在网络安全行业得到了很多的应用&#xff0c;不管是网络安全研究人员、…

手把手教你开发Python桌面应用-PyQt6图书管理系统-修改密码UI设计实现

锋哥原创的PyQt6图书管理系统视频教程&#xff1a; PyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~_哔哩哔哩_bilibiliPyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~共计24条视频&…

如何编译zlib?

学习文章&#xff1a;windows zlib库编译步骤_nmake 编译 zlib-CSDN博客 记录关键步骤&#xff1a; 打开 执行&#xff1a; 先cd到该目录&#xff1a; C:\Users\xxx\Downloads\zlib-1.2.11\contrib\masmx86 (这是我的zlib源码的下载路径&#xff09; 执行bld_ml32.bat 再…

计算机网络——08应用层原理

应用层原理 创建一个新的网络 编程 在不同的端系统上运行通过网络基础设施提供的服务&#xff0c;应用进程批次通信如Web Web服务器软件与浏览器软件通信 网络核心中没有应用层软件 网络核心没有应用层功能网络应用只能在端系统上存在 快速网络应用开发和部署 网络应用…