二叉搜索树的插入与删除图解

===================================================================

一、二叉搜索树(BSTree)的概念

       二叉搜索树又被称为二叉排序树,那么它本身也是一棵二叉树,那么满足以下性质的二叉树就是二叉搜索树:
       1、若左子树不为空,则左子树上左右节点的值都小于根节点的值
       2、若它的右子树不为空,则它的右子树上所有的节点的值都大于根节点的值
       3、它的左右子树也要分别是二叉搜索树
===================================================================

二、二叉搜索树的插入

  1、搜索
       插入之前我们先来说说它的搜索,像上图这样的一棵二叉搜索树,我们要查找某一个元素是很简单的。因为它的节点分布是有规律的,所以查找一棵元素只需要如下的步骤就可以了:
        
       2、插入
       由于二叉搜索树的特殊性质确定了二叉搜索树中每个元素只可能出现一次,所以在插入的过程中如果发现这个元素已经存在于二叉搜索树中,就不进行插入。
否则就查找合适的位置进行插入。
第一种情况:_root为空
直接插入,return  true;
第二种情况:要插入的元素已经存在
如上面所说,如果在二叉搜索树中已经存在该元素,则不再进行插入,直接return  false;
第三种情况:能够找到合适位置
===================================================================

三、二叉搜索树的删除

对于二叉搜索树的删除操作,主要是要理解其中的几种情况,写起来还是比较简单的。
当然一开始还是需要判断要删除的节点是否存在于我们的树中,如果要删除的元素都不在树中,就直接返回false;否则,再分为以下四种情况来进行分析:
     》要删除的节点无左右孩子
     》要删除的节点只有左孩子
     》要删除的节点只有右孩子
     》要删除的节点有左、右孩子
 
删除方法解释:
     对于第一种情况,我们完全可以把它归为第二或者第三种情况,就不用再单独写一部分代码进行处理;
     》如果要删除的节点只有左孩子,那么就让该节点的父亲结点指向该节点的左孩子,然后删除该节点,返回true;
          
     》如果要删除的节点只有右孩子,那么就让该节点的父亲结点指向该节点的右孩子,然后删除该节点,返回true;
            
          对于上面这两种情况我们还应该在之前进行一个判断,就是判断这个节点是否是根节点,如果是根节点的话,就直接让根节点指向这个节点的左孩子或右孩子,然后删除这个节点。
       》最后一种也是最麻烦的一种就是要删除的节点的左右孩子都存在。此时我们的删除方法如下:
           1、找到该节点的右子树中的最左孩子(也就是右子树中序遍历的第一个节点)
           2、把它的值和要删除的节点的值进行交换
           3、然后删除这个节点即相当于把我们想删除的节点删除了,返回true;
===================================================================
程序代码:
1、二叉搜索树的插入操作
 1  bool Insert(const K& key)
 2     {
 3         if (_root == NULL)
 4         {
 5             _root = new Node(key);
 6             return true;
 7         }
 8         Node* parent=NULL;
 9         Node* pcur = _root;
10         while (pcur)
11         {
12             if (pcur->_key == key)  //有key节点,则不再插入
13                 return false;
14             if (pcur->_key > key)
15             {
16                 parent = pcur;
17                 pcur = pcur->_left;
18             }
19             else if (pcur->_key < key)
20             {
21                 parent = pcur;
22                 pcur = pcur->_right;
23             }
24         }
25         if (parent->_key < key)
26             parent->_right = new Node(key);
27         else
28             parent->_left = new Node(key);
29         return true;
30     }

2、二叉搜索树的删除操作 bool Remove(const K& key)

 1 bool Remove(const K& key)
 2     {
 3         assert(_root);
 4         Node* parent = NULL;
 5         Node* pcur = _root;
 6         Node* del = pcur;
 7         while (pcur != NULL  && pcur->_key != key)
 8         {
 9             if (pcur->_key > key)
10             {
11                 parent = pcur;
12                 pcur = pcur->_left;
13             }
14             else if (pcur->_key < key)
15             {
16                 parent = pcur;
17                 pcur = pcur->_right;
18             }
19         }
20         if (pcur == NULL)
21             return false;
22         if (pcur->_left == NULL)      //只有右孩子
23         {
24             //如果pcur就是根节点的话,让根节点指向根的右
25             if (pcur == _root)
26                 _root = pcur->_right;
27             else if (pcur == parent->_left) 
28             {
29                 parent->_left = pcur->_right;
30             }
31             else
32             {
33                 parent->_right = pcur->_right;
34             }
35             del = pcur;
36         }
37         else if (pcur->_right == NULL)     //只有左孩子
38         {
39            //如果是根节点,让根节点指向根的左
40             if (pcur == _root)
41                 _root = pcur->_left;
42             else if (parent->_left == pcur)
43             {
44                 parent->_left = pcur->_left;
45             }
46             else
47                 parent->_right = pcur->_left;
48             del = pcur;
49         }
50         //pcur左右孩子都不为空
51         else
52         {
53            //找到节点右子树的最左节点
54             Node* left = pcur->_right;
55             parent = pcur;
56             while (left->_left)     
57             {
58                 parent=left;
59                 left = left->_left;
60             }
61             del = left;
62             pcur->_key = left->_key;   //交换节点的值
63             if (parent->_left == left)
64             {
65                 parent->_left = left->_right;
66             }
67             else
68             {
69                 parent->_right = left->_right;
70             }
71 
72         }
73         delete del;
74         return true;
75     }

 

转载于:https://www.cnblogs.com/MrListening/p/5782752.html

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

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

相关文章

面试总结

lru算法&#xff1a;最近最少使用  1.新数据插入到链表头部&#xff1b;  2.每当缓存命中&#xff08;即缓存数据被访问&#xff09;&#xff0c;则将数据移到链表头部&#xff1b;  3.当链表满的时候&#xff0c;将链表尾部的数据丢弃。 自定义控件&#xff1a; 1.measu…

win10+anaconda安装tensorflow和keras遇到的坑小结

win10下利用anaconda安装tensorflow和keras的教程都大同小异&#xff08;针对CPU版本&#xff0c;我的gpu是1050TI的MAX-Q&#xff0c;不知为啥一直没安装成功&#xff09;&#xff0c;下面简单说下步骤。 一 Anaconda安装 一般来说&#xff0c;python选择3.6的&#xff0c;目…

现代制造工程课堂笔记07——应力应变分析(考点应力莫尔圆)

目录 选择判断题&#xff0c;简单计算在莫尔圆那里出 一、单向拉伸中的应力应变 手写笔记 选择判断题&#xff0c;简单计算在莫尔圆那里出 一、单向拉伸中的应力应变 、 手写笔记

win10+tensorflow CPU 部署CTPN环境

刚弄明白CTPN部署的时候&#xff0c;CTPN作者刚更新了简易代码版本&#xff0c;看介绍是把代码优化了不需要多的配置。。。感觉好忧伤&#xff01; 源码地址&#xff1a;https://github.com/eragonruan/text-detection-ctpn/tree/master 新版本地址&#xff1a;https://githu…

css如何实现背景透明,文字不透明?

之前做了个半透明弹层&#xff0c;但设置背景半透明时&#xff0c;子元素包含的字体及其它元素也都变成了半透明。对opacity这个属性认识的不透彻&#xff0c;在这里做一些总结&#xff0c;方便以后使用。 背景透明&#xff0c;文字不透明的解决方法&#xff1a;为元素添加一个…

是什么时候开始学习gulp了

转自&#xff1a;http://www.ydcss.com/archives/18 简介&#xff1a; gulp是前端开发过程中对代码进行构建的工具&#xff0c;是自动化项目的构建利器&#xff1b;她不仅能对网站资源进行优化&#xff0c;而且在开发过程中很多重复的任务能够使用正确的工具自动完成&#xff1…

matlab GUI——按下按钮在指定的坐标下绘制函数图像

目录 1.组件布局 2.回调函数设置 3.编写回调函数 1.组件布局 2.回调函数设置 右键单击plot按钮——查看回调——call backs

【转】【UML】使用Visual Studio 2010 Team System中的架构师工具(设计与建模)

Lab 1: 应用程序建模 实验目标 这个实验的目的是展示如何在Visual Studio 2010旗舰版中进行应用程序建模。团队中的架构师会通过建模确定应用程序是否满足客户的需求。 你可以创建不同级别的详细模型&#xff0c;并将它们彼此结合、测试然后发布到你的开发计划里。 在这个实验中…

深度学习基础(一)起源

目录 一、DP的前世 1.perceptron 2.NN 3.DP 二、DP的基础知识 1.convolution 2.padding 3.pooling 4.Flatten 5.fully connected 6.dropout 一、DP的前世 深度学习发展至今经历颇为曲折&#xff0c;上世纪起源&#xff0c;火热起来也是20世纪初的时候&#xff0c;具体时…

ANSYS经典界面中梁单元实例全解析

转载链接&#xff1a;http://www.jishulink.com/content/post/361389 文中红色部分为自己添加&#xff01;&#xff01;&#xff01; 转载的文章中提到的梁单元截面是常用的工字形&#xff0c;那么要是不规则的截面形状的话需要自己进行截面形状绘制&#xff0c;具体可以参考…

ant的安装和使用

1.ant的安装 1.1 添加环境变量&#xff1a;ANT_HOMED:\software\ant\apache-ant-1.10.1 在path中添加&#xff1a;%ANT_HOME%\bin 1.2 测试是否安装成功 在cmd中输入ant&#xff0c;如果出现如下提示表示安装成功 2.定义简单的build.xml 2.1 创建HelloWord.java package test; …

Language-Directed Hardware Design for Network Performance Monitoring——Marple

网络监控困难 1、仅仅通过去增加特定的监控功能到交换机是不能满足运营商不断变化的需求的。&#xff08;交换机需要支持网络性能问题的表达语言&#xff09;2、他们缺乏对网络深处的性能问题进行本地化的可见性&#xff0c;间接推断网络问题的原因3、当前的交换机监控并没有提…

深度学习基础(四)优化函数(梯度下降函数)

梯度下降函数也就是优化函数&#xff0c;在神经网络训练过程最重要的函数。重要程度类似于调校对于汽车的重要性&#xff0c;搭建模型和参数设置等操作“造好了一辆汽车”&#xff0c;优化函数“调校”。因为汽车最终的操控性和加速性能等指标很大程度取决于调校&#xff0c;调…

js 实现 复制 功能 (zeroclipboard)

#复制功能因访问权限和安全问题&#xff0c; 被浏览器禁了# 我要实现的功能&#xff1a;点击复制按钮&#xff0c;复制浏览器的当前页面地址&#xff0c;加上用户选择的参数&#xff08;用户查找过滤&#xff09;&#xff0c;直接将该链接发给别人&#xff0c;点击打开就是对应…

深度学习基础(二)激活函数

激活函数&#xff08;也被称为激励函数&#xff09;的意义就是加入非线性因素&#xff0c;使得神经网络具有非线性表达的能力。其必要条件是激活函数的输入和输出都是可微的&#xff0c;因为神经网络要求处处可微。(可微是指函数的各个方向可导&#xff0c;可微大于等于可导) …

Please ensure that adb is correctly located at……问题解决方案

启动android模拟器时.有时会报The connection to adb is down, and a severe error has occured.的错误.在网友说在任务管理器上把所有adb.exe关闭掉.重启eclipse.但试过不管用.所以在外国网站上找到一种可行的方法:1.先把eclipse关闭.2.在管理器转到你的android SDK 的platfor…

2016.8.23

1 贴吧里看到一个关于因为游戏闹翻的故事&#xff0c;大致情况是这样的&#xff1a;某女初中的时候有个闺蜜。后来此人因为抑郁之类的精神问题被送到医院&#xff0c;这让女主很苦闷且脆弱又孤单&#xff0c;这时候她的闺蜜去医院看望她&#xff0c;然后女主就喜欢上了这位闺蜜…

[Spring]01_环境配置

1.1 Spring jar包下载 &#xff08;1&#xff09;进入官网http://repo.spring.io &#xff08;2&#xff09;在资源库界面点击Artifacts标签&#xff0c;然后点击libs-release-local&#xff0c;展开后依次点击org -> springframework -> spring。 然后&#xff0c;就可…

深度学习基础(三)loss函数

loss函数&#xff0c;即损失函数&#xff0c;是决定网络学习质量的关键。若网络结构不变的前提下&#xff0c;损失函数选择不当会导致模型精度差等后果。若有错误&#xff0c;敬请指正&#xff0c;Thank you&#xff01; 目录 一、loss函数定义 二、常见的loss算法种类 1.M…