二叉搜索树的删除操作详解,图文并茂,化繁为简
文章目录
- 前言
- 一、二叉树搜索树概念
- 二、二叉树删除操作的讲解
- 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.我们老师说过,写代码其实是做题的最后一步,首先你要学会分析一个题,最好把思路能在自己的脑子中过一遍,结合画图,想明白过程之后再动手,这才是提高自己代码能力的有效途径。
二叉搜索树的删除操作详解,图文并茂,化繁为简相关推荐
- 算法:二叉搜索树BST - 删除节点 详解(Java实现)
删除节点 删除节点存在 3 种情况,几乎所有类似博客都提到了这点.这 3 种情况分别如下: 没有左右子节点,可以直接删除 存在左节点或者右节点,删除后需要对子节点移动 同时存在左右子节点,不能简单的删 ...
- 二叉搜索树的删除操作可以交换吗_JavaScript数据结构 — 二叉搜索树(BST)ES6实现...
1. 概述 最基本的数据结构是向量和链表,为了将二者的优势结合起来,我们引入了二叉树,可以认为二叉树是列表在维度上的拓展.而今天要介绍的二叉搜索树(BST)则是在形式上借鉴了二叉树,同时也巧妙借鉴了有 ...
- 二叉搜索树的删除操作可以交换吗_一文看懂数据结构中的树
通常在开始学编程的时候,你会接触一些常用数据结构.到最后一般会学到哈希表.对于修读计算机科学学位的朋友,你通常要上专门的数据结构课,从了解有关链表.队列和栈的各种知识.这些统称为线性数据结构,因为依逻 ...
- 7-2 二叉搜索树的删除操作
给出一棵二叉搜索树(没有相同元素), 请输出其删除部分元素之后的层序遍历序列. 删除结点的策略如下: 如果一个结点是叶子结点,则直接删除: 如果一个结点的左子树不为空, 则将该结点的值设置为其左子树上 ...
- 二叉搜索树(BST)详解及代码实现
推荐可视化插入.删除节点的二叉树网站:Binary Search Tree Visualization (usfca.edu) 1. 概述 二叉搜索树(Binary Search Tree,简称BST ...
- 08_Python算法+数据结构笔记-二叉搜索树查询/删除-AVL树旋转/插入/应用-贪心算法
b站视频:路飞IT学城 清华计算机博士带你学习Python算法+数据结构_哔哩哔哩_bilibili #71 二叉搜索树:查询 import randomclass BiTreeNode:def __ ...
- Python实现二叉搜索树的删除功能
Python实现二叉搜索树的删除功能 二叉搜索树(二叉查找树,Binary Search Tree)又称为排序二叉树.有序二叉树. 二叉搜索树的实现可以参考:https://blog.csdn.net ...
- 数据结构 二叉搜索树的删除
文章目录 概述 待删除的结点没有子树 待删除的结点仅有一颗子树 待删除的结点有两颗子树 C代码实现 概述 这是一篇短文,专门考究一下二叉搜索树的删除. 二叉搜索树的建立非常简单,如果不熟悉的见此文 树 ...
- leetcode450. 删除二叉搜索树中的节点(详解)
一:题目 二:上码 1.确定递归函数和参数 TreeNode* deleteNode(TreeNode* root, int key) 这里的返回参数 我们也用一个指针接住,反正我们最终是返回的整棵树 ...
- 红黑树的删除操作详解
红黑树的删除操作 无子节点时,删除节点可能为红色或者黑色: 1.1 如果为红色,直接删除即可,不会影响黑色节点的数量: 1.2 如果为黑色,则需要进行删除平衡的操作了: 只有一个子节点时,删除节点只能 ...
最新文章
- CentOS中配置VNC Server
- 斯坦福大学机器学习第三课“多变量线性回归“
- python绑定内核_向Ipython添加python2内核
- Mine Video Player – 视频播放器WordPress插件
- 拳王虚拟项目公社:0成本的售卖高考资料的虚拟资源的其他最简单最轻松玩法
- Blender Python UV 学习
- 三角诱导公式 两角和与差 二倍角公式 降幂公式 半角公式 万能公式 积化和差公式 和差化积公式
- pip更改为豆瓣源以及源信任问题
- 【脑图制作】万彩脑图大师教程 | 修改主题样式
- 阿里靠什么武功秘籍渡过“双十一“的天量冲击
- dasheddotted IE6爷爷居然认不出来的说……
- 苹果地图副总裁_挖角苹果高级计算机视觉专家 Mapillary地图更新添一员大将
- Linux操作系统学习
- 一文看懂传统服务器、云服务器和虚拟主机之间的区别
- 服务器无法ping通百度的处理方式
- 解决移动硬盘不能弹出问题
- 【Python爬虫实战】用urllib与服务端交互(发送和接收数据)
- Redis无法启动的原因以及解决方案
- Proxmox VE 7.2 网卡直通
- zabbix监控配置流程SQL语句