二叉搜索树的删除算法主要分两种情况:

1、要删除的节点只有一个孩子(左孩子或右孩子),这种情况比较简单,只需要将该孩子连接到当前节点的父节点即可。

下面重点讲讲第二种情况:

2、第二种情况便是要删除的节点有两个孩子,这个时候的算法就比较复杂(相比较于只有一个孩子的情况)。首先我们需要找到待删除节点的左子树上的最大值节点,或者右子树上的最小值节点,然后将该节点的参数值与待删除的节点参数值进行交换,最后删除该节点,这样需要删除的参数就从该二叉树中删除了。

对于第二种情况,由于需要进行节点交换,刚接触的时候,可能会困惑,进行交换之后的二叉树是否还满足二叉搜索树的结构特点呢?以与左子树最大节点交换为例,尽管左子树的根节点比其父节点小,但是左子树的节点中存在比左子树的根节点大的节点,这样如何保证其比右子树的根节点小呢?比如下面一个BST就不满足算法:

39

30                         44

27            36

22          31              45(大于44)

37

上面的二叉树乍一看满足BST的结构特点:左孩子的值小于父亲,右孩子的值大于父亲

但是如从BST构成的角度,一步一步的分析,就会发现节点45应该在右子树上。

其实,上述二叉树(如果是BST)的左子树的所有节点都应小于39,左子树节点的最大值也应该在30与39之间,不会存在大于44的情况。

由上讨论,便知不存在左子树最大节点大于右子树根节点的情况了。(同理也不会存在右子树最小值大于左子树根节点的情况)

下面附上一段BST删除算法代码(源于Clifford A.Shaffer 《date structures and algorithm analysis in C++》):

(此段代码的删除不是简单意义上的删除,而是对二叉树的重构)

//return the root of the updated tree after removal
//t point to the removed node
BinNode<Elem>* removehelp(BinNode<Elem>* subroot, const Elem& e, BinNode<Elem>*& t) {if (subroot == NULL) return NULL;else if (e < subroot->val())subroot->setLeft(removehelp(subroot->left(), e, t));else if (e > subroot->val())subroot->setRight(removehelp(subroot->right(), e, t));else { // Found it: remove itBinNode<Elem>* temp;t = subroot;if (subroot->left() == NULL)subroot = subroot->right();else if (subroot->right() == NULL)subroot = subroot->left();else {  // Both children are non-emptysubroot->setRight(deletemin(subroot->right(), temp));Elem te = subroot->val();subroot->setVal(temp->val());temp->setVal(te);t = temp;}}return subroot;
}
//return the root of the tree after remove the node with the minimum value
BinNode<Elem>* deletemin(BinNode<Elem>* subroot, BinNode<Elem>*& min) {if (subroot->left() == NULL) {min = subroot;return subroot->right();}else { // Continue leftsubroot->setLeft(deletemin(subroot->left(), min));return subroot;}
}

二叉搜索树(BST)的删除算法原理解析相关推荐

  1. 看动画学算法之:二叉搜索树BST

    文章目录 简介 BST的基本性质 BST的构建 BST的搜索 BST的插入 BST的删除 看动画学算法之:二叉搜索树BST 简介 树是类似于链表的数据结构,和链表的线性结构不同的是,树是具有层次结构的 ...

  2. 【数据结构与算法】3.二叉搜索树(BST)、c++代码

    二叉搜索树(BST).c++代码 参考 https://blog.csdn.net/c_living/article/details/81021510

  3. 二叉搜索树BST的学习

    文章目录 二叉搜索树BST 什么是BST? 用BST做什么? 一.BST的特性 BST的特性是什么? 1.[230. 二叉搜索树中第K小的元素](https://leetcode.cn/problem ...

  4. 真c++ 从二叉树到红黑树(3)之二叉搜索树BST

      此文章为从二叉树到红黑树系列文章的第三节,主要介绍介绍二叉搜索树BST,为AVL和RedBlack打下基础 文章目录 一.前面文章链接~(点击右边波浪线可以返回目录) 二.二叉搜索树BST的定义~ ...

  5. 二叉搜索树BST红黑树

    二叉搜索树基础知识 提起红黑树咱们肯定要先说说这个二叉搜索树(BST) 二叉搜索树又叫二叉查找树,二叉排序树:它具有以下特点: 如果它的左子树不为空,则左子树上结点的值都小于根结点. 如果它的右子树不 ...

  6. 阿里开发者招聘节 | 面试题02-04:给定一个二叉搜索树(BST),找到树中第K小的节点

    为帮助开发者们提升面试技能.有机会入职阿里,云栖社区特别制作了这个专辑--阿里巴巴资深技术专家们结合多年的工作.面试经验总结提炼而成的面试真题这一次将陆续放出(面试题官方参考答案将在专辑结束后统一汇总 ...

  7. 二叉搜索树(BST的理论剖析+代码实现)

    二叉搜索树(BST树) 文章目录 二叉搜索树(BST树) 1.二叉搜索树的概念 2.二叉搜索树的结构定义 2.1 二叉搜索树结点模板的定义 2.2 二叉搜索树类模板的定义 3.二叉搜索树的效率 4.二 ...

  8. 五.树,二叉树,二叉搜索树(BST)和自平衡二叉搜索树(AVL)

    1.树 树是一种数据结构 比如:目录结构 树是一种可以递归定义的数据结构 树是由n个节点组成的集合: 如果 n=0, 那这是一颗空树 如果 n>0, 那存在1个节点作为树的根节点,其他节点可以分 ...

  9. 二叉搜索树 (BST)

    二叉搜索树 (BST : Binary Search Tree) 又名 二叉查找树 或 二叉排序树. 二叉搜索树: 左孩子的值 一定小于或等于 父结点的值 二叉搜索树: 右孩子的值 一定大于或等于 父 ...

最新文章

  1. Java多线程——多线程的基本概念和使用
  2. 怎么用centos7运行c语言程序_写C语言程序,如何提升程序运行效率?我的一点经验分享给你们!...
  3. 设置span的宽度,让span象button那样显示
  4. GDT、GDTR、LDT、LDTR的理解
  5. 没学c语言可以学python_学了Python,但是没有学c,直接去学c++是可行的吗?
  6. java 中map_Java Map集合详解
  7. 查看layui的版本号
  8. 文本匹配工具正式开源
  9. 浅谈敏捷思想-05.精益画布电梯演讲
  10. CodeLens 显示引用
  11. scrollbars属性,MultiLine 属性
  12. PKU ACM 1008 玛雅历
  13. unity黑白滤镜_unity图像优化美化滤镜渲染插件Beautify 6.2.7
  14. 投之家与妙优车达成战略合作,加强推进优质资产端建设
  15. 不一样的厦门,不一样的旅行!
  16. 频率换算:模拟频率、模拟角频率、数字频率
  17. vue路由传参 params传参不能传对象
  18. 最小费用最大流之 zkw费用流与普通费用流
  19. IDEA打包JavaWeb的War包并部署到Tomcat
  20. POJ3238生日相同问题C++

热门文章

  1. 逆水寒土豪最多的服务器,逆水寒某土豪为了不合区,硬生生把一个服务器金价拉高了15%...
  2. 微信小程序之三步简单上手如何使用后端提供的接口
  3. pve和pvp是什么意思(穿越pve和pvp是什么意思)
  4. 传聚划算规则调整将取消多项收费 已有商家收到通知
  5. 百度指数批量查询(免费放送)
  6. android canvas imageview,怎么把canvas的内容在imageview上显示
  7. 华三防火墙h3cf100配置双宽带_华三防火墙主备配置 h3c f100防火墙配置教程
  8. MATLAB在遥感图像处理中的应用
  9. untiy加载一张本地图片到Image 精灵
  10. 大学生计算机爱课程网,爱课程2020电脑版