文章目录

  • 前言
  • 一、二叉树搜索树概念
  • 二、二叉树删除操作的讲解
    • 1.分情况讨论:
    • 2.完整代码
  • 总结

前言


一、二叉树搜索树概念

二叉搜索树又称为二叉排序树,它具有二叉树以下的性质:
-若它的左子树不为空,则左子树上所有的结点的值都小于根节点的值;
-若它的右子树不为空,则右子树上所有的结点的值都大于根节点的值;
-它的左右子树也分别为二叉搜索树。

二叉树搜索树的中序一定有序。
int[] a={5,3,7,1,4,6,8,9};
中序遍历:{1,3,4,5,6,7,8,9};

搜索二叉树的遍历和插入比较简单,所以在这主要讲解一下二叉搜索树的删除操作,我看老师讲解的二叉树的删除操作视频看了好几遍,还看了好几篇讲解二叉搜索树删除操作的,终于理解了,所以想用自己的方法记录一下这个学习的过程。

二、二叉树删除操作的讲解

1.分情况讨论:

删除操作可以分为3种情况:node为待删除的节点,parent为待删除结点的父节点

1.node左右孩子均不存在
2.node只有左孩子或者只有有孩子
3.node左右孩子均存在

第一种情况:当待删除结点node的左右孩子均不存在的时候,那么它是叶子结点或者只有一个根结点的树;删除的时候如果node是根节点,则让根结点为空;如果node为其父节点的左孩子,则把父亲左孩子置为空;否则把父亲右孩子置为空。(如果这一段文字看不懂,可以自己画个图试试看,相信你自己)

代码如下:

   if(node.left==null&&node.left==null){if(node==root){root=null;}else if(node==parent.left){parent.left=null;}else{parent.right=null;}}

第二种情况:当待删除的结点node只有左孩子或者右孩子时,那么在删除的时候要断两个联系,node和parent,node和它的孩子结点的联系;再新建一个一个联系;如下图所示:当要删除的结点没有左孩子时,就是下图中左边的这种情况:
1.首先如果待删除结点为根节点,则让待删除的节点的左孩子为根;
2.如果待删除结点为其父节点的左孩子,则让待删除的结点的左孩子指向其父节点。
3.如果待删除结点为其父节点的右孩子,则让待删除的结点的左孩子指向其父节点。

if(node.left!=null&&node.right==null){//有左孩子,没有右孩子if(node==root){root=node.left;}else if(node==parent.left){parent.left=node.left;}else{parent.right=node.left;}}else if(node.left==null&&node.right!=null){//有右孩子,没有左孩子if(node==root){root=node.right;}else if(node==parent.left){parent.left=node.right;}else{parent.right = node.right;}}

第三种情况
当待删除的结点左右孩子都有时,此时采用替换法,定义两个节点,ghost和ghostParent,ghost中存放待删除结点左子树中最大的结点(或者右子树中最小的值替换),ghostParent保存ghost的父节点,找到ghost后,用ghost的值替换待删除结点node的值,然后判断待删除结点是否有左孩子,如果有,则让其左孩子指向其父节点(ghostParent)。

            Node ghost=node.left;Node ghostParent=null;while(ghost.right!=null){ghostParent=ghost;ghost=ghost.right;}//进行替换node.key=ghost.key;//删除ghost结点(其右孩子一定为空)if(node==ghostParent){ghostParent.left=ghost.left;}else{ghostParent.right=ghost.left;}

2.完整代码

public boolean remove(Integer key){//找要删除的结点key所在的结点为node,node的双亲结点,记作parentNode current=root;Node parent=null;while(current!=null){int comp=key.compareTo(current.key);if(comp==0){removeInternal(current,parent);return true;}else if(comp<0){parent=current;current=current.left;}else{parent=current;current=current.right;}}return false;}private void removeInternal(Node node,Node parent){//总共有四种情况:1.两边都没有左右孩子 2.只有一边有孩子  3.两边都有子孩子//node为要删除的结点if(node.left==null&&node.left==null){if(node==root){root=null;}else if(node==parent.left){parent.left=null;}else{parent.right=null;}}else if(node.left!=null&&node.right==null){//有左节点,没有右节点if(node==root){root=node.left;}else if(node==parent.left){parent.left=node.left;}else{parent.right=node.left;}}else if(node.left==null&&node.right!=null){if(node==root){root=node.right;}else if(node==parent.left){parent.left=node.right;}else{parent.right = node.right;}}else{//左右孩子都有的时候Node ghost=node.left;Node ghostParent=null;while(ghost.right!=null){ghostParent=ghost;ghost=ghost.right;}//进行替换node.key=ghost.key;//删除ghost结点(其有孩子一定为空)if(node==ghostParent){ghostParent.left=ghost.left;}else{ghostParent.right=ghost.left;}}}

总结

1.对于删除操作,其实代码不复杂,前两种情况考虑起来也比较简单,主要是第三种情况,有点复杂,采用替换法的思想,找待删除结点左子树中最大的值替换或者右子树中最小的值替换,才能保证二叉搜索树的结构完整。
2.我们老师说过,写代码其实是做题的最后一步,首先你要学会分析一个题,最好把思路能在自己的脑子中过一遍,结合画图,想明白过程之后再动手,这才是提高自己代码能力的有效途径。

二叉搜索树的删除操作详解,图文并茂,化繁为简相关推荐

  1. 算法:二叉搜索树BST - 删除节点 详解(Java实现)

    删除节点 删除节点存在 3 种情况,几乎所有类似博客都提到了这点.这 3 种情况分别如下: 没有左右子节点,可以直接删除 存在左节点或者右节点,删除后需要对子节点移动 同时存在左右子节点,不能简单的删 ...

  2. 二叉搜索树的删除操作可以交换吗_JavaScript数据结构 — 二叉搜索树(BST)ES6实现...

    1. 概述 最基本的数据结构是向量和链表,为了将二者的优势结合起来,我们引入了二叉树,可以认为二叉树是列表在维度上的拓展.而今天要介绍的二叉搜索树(BST)则是在形式上借鉴了二叉树,同时也巧妙借鉴了有 ...

  3. 二叉搜索树的删除操作可以交换吗_一文看懂数据结构中的树

    通常在开始学编程的时候,你会接触一些常用数据结构.到最后一般会学到哈希表.对于修读计算机科学学位的朋友,你通常要上专门的数据结构课,从了解有关链表.队列和栈的各种知识.这些统称为线性数据结构,因为依逻 ...

  4. 7-2 二叉搜索树的删除操作

    给出一棵二叉搜索树(没有相同元素), 请输出其删除部分元素之后的层序遍历序列. 删除结点的策略如下: 如果一个结点是叶子结点,则直接删除: 如果一个结点的左子树不为空, 则将该结点的值设置为其左子树上 ...

  5. 二叉搜索树(BST)详解及代码实现

    推荐可视化插入.删除节点的二叉树网站:Binary Search Tree Visualization (usfca.edu) 1. 概述 二叉搜索树(Binary Search Tree,简称BST ...

  6. 08_Python算法+数据结构笔记-二叉搜索树查询/删除-AVL树旋转/插入/应用-贪心算法

    b站视频:路飞IT学城 清华计算机博士带你学习Python算法+数据结构_哔哩哔哩_bilibili #71 二叉搜索树:查询 import randomclass BiTreeNode:def __ ...

  7. Python实现二叉搜索树的删除功能

    Python实现二叉搜索树的删除功能 二叉搜索树(二叉查找树,Binary Search Tree)又称为排序二叉树.有序二叉树. 二叉搜索树的实现可以参考:https://blog.csdn.net ...

  8. 数据结构 二叉搜索树的删除

    文章目录 概述 待删除的结点没有子树 待删除的结点仅有一颗子树 待删除的结点有两颗子树 C代码实现 概述 这是一篇短文,专门考究一下二叉搜索树的删除. 二叉搜索树的建立非常简单,如果不熟悉的见此文 树 ...

  9. leetcode450. 删除二叉搜索树中的节点(详解)

    一:题目 二:上码 1.确定递归函数和参数 TreeNode* deleteNode(TreeNode* root, int key) 这里的返回参数 我们也用一个指针接住,反正我们最终是返回的整棵树 ...

  10. 红黑树的删除操作详解

    红黑树的删除操作 无子节点时,删除节点可能为红色或者黑色: 1.1 如果为红色,直接删除即可,不会影响黑色节点的数量: 1.2 如果为黑色,则需要进行删除平衡的操作了: 只有一个子节点时,删除节点只能 ...

最新文章

  1. CentOS中配置VNC Server
  2. 斯坦福大学机器学习第三课“多变量线性回归“
  3. python绑定内核_向Ipython添加python2内核
  4. Mine Video Player – 视频播放器WordPress插件
  5. 拳王虚拟项目公社:0成本的售卖高考资料的虚拟资源的其他最简单最轻松玩法
  6. Blender Python UV 学习
  7. 三角诱导公式 两角和与差 二倍角公式 降幂公式 半角公式 万能公式 积化和差公式 和差化积公式
  8. pip更改为豆瓣源以及源信任问题
  9. 【脑图制作】万彩脑图大师教程 | 修改主题样式
  10. 阿里靠什么武功秘籍渡过“双十一“的天量冲击
  11. dasheddotted IE6爷爷居然认不出来的说……
  12. 苹果地图副总裁_挖角苹果高级计算机视觉专家 Mapillary地图更新添一员大将
  13. Linux操作系统学习
  14. 一文看懂传统服务器、云服务器和虚拟主机之间的区别
  15. 服务器无法ping通百度的处理方式
  16. 解决移动硬盘不能弹出问题
  17. 【Python爬虫实战】用urllib与服务端交互(发送和接收数据)
  18. Redis无法启动的原因以及解决方案
  19. Proxmox VE 7.2 网卡直通
  20. zabbix监控配置流程SQL语句

热门文章

  1. Python openpyxl 删除excel有删除线的文字
  2. Unity发布WebGL之后读取StreamingAssets文件路径数据
  3. JavaScript实现气球打字游戏
  4. 5. Prometheus概念-Jobs和Instances
  5. 期货及衍生品基础 - 概述总结
  6. 经典ASP.NET视频教程
  7. HQChart使用教程85-股票复权计算
  8. sai文字图层、钢笔图层如何转普通图层
  9. Arcgis空间连接
  10. 网站数据被入侵怎么办 如何防止网站数据库被攻击 被篡改