BST删除特定节点

前言

  • 一个平常的星期三晚上,一节通选课中,在老师放的视频和极寒空调的折磨之下,想着做点别的什么的我,打开了博客园。想起来做题下午数据结构课中老师最后在讲BST删除节点的操作,并且以一种很有意思有条理的方式讲解,我也理解了节点删除操作是怎么实现的。既然现在都那么无聊了,不如就试着回忆一下当时老师的讲解思路并记录下来把。

前提知识

  • 要想找到想删除的值对应的节点,不免要利用BST的特点————左子树的值小于根节点的值,右子树的值大于根节点的值,因为想要删除那个节点,要做的第一件事就是找到那个节点。

情景再现(按照我记得的听到的。。。)

  • 假如你是某个公司的程序员,老板给你的任务是删除树中某个指定的值对应的节点,又不能破坏BST的结构。
  • 第一天,你知道这是个有点难度的任务,于是你决定从简单的情况开始处理。你发现,假如要删除的节点是一个叶子节点(既没有左子树又没有右子树),那要做的操作很简单,只需要将该节点的上一级根节点指向该节点的指针置为NULL即可。完成了这个操作后你很开心,今天的任务完成了可以下班了,而且也好跟老板汇报进度。
  • 第二天,解决完最简单的情况后,你试着把条件增加一点,假如要删除的节点只有一个子树(左子树或者右子树),那要做的操作也很简单,只需要将该节点的上一级根节点指向该节点的指针指向该节点的那个唯一的子树就可以了。完成了这个操作之后你又开心又有点不开心,开心是因为今天的任务完成了可以下班了,好跟老板汇报进度,不开心的是能混的日子又少了,准备要面对最难的部分了。
  • 第三天,你知道早晚要面对这个问题的,心理也没有那么忐忑了。假如要删除的节点既有左子树又有右子树,那怎么样操作才能完成要求呢?直接删除掉该结点的话会出现一个问题,且不说能不能直接接上去,该用左子树还是右子树去接上上一级根节点呢?接上去之后另一棵子树该怎么处理呢?想到这里,你的心有点乱了,不妨想想,能不能找别的节点代替这个要删除的节点,那么就要引出方法1了:
    1. 要想找一个节点的值代替这个要删除的节点,那么这个节点的值要满足三个条件:1. 值要小于根节点(以左子树为例) 2. 值要大于左子树的任何值 3. 值要小于右子树的任何值。要想满足第一个条件,那就要在该节点的左右子树里面找值;要满足第二个条件,这个值要大于左子树的最大值;要满足第三个条件,这个值要小于右子树的最小值。我们发现,其实左子树的最大值和右子树的最小值,就是满足情况的值。那这里就要规定一下我们选哪一个(两个都可以)。以找右子树的最小值为例,这里就要用到BST的findMin方法。第二个问题出现了,假如找到了右子树的最小值,那可以说拿去代替就拿去么?如果它没有子树或者有一个子树还好说,那假如有两个子树呢?那其实我们要做的不就是再找它右子树的最小值去替代它,其实这不就是一个递归的过程么?想到这里,最大的问题终于解决了,你稍加思索,快速写出了代码然后打卡下班。
private BinaryNode remove(Comparable x, BinaryNode t) {
if (t == null) return t; // not found
if (x.compareTo(t.element) < 0)
t.left = remove(x, t.left); // search left
else if (x.compareTo(t.element) > 0)
t.right = remove(x, t.right); // search right
else if (t.left != null && t.right != null) { // found it; two children
t.element = findMin(t.right).element; // find the min, replace, and remove it
t.right = remove(t.element, t.right);
}
else
t = (t.left != null) ? t.left : t.right; // found it; one child
return t;
}

分割线:通选课老师又提早下课了,加上要回图书馆放东西,早点回宿舍处理一下国庆回家的事,今天先走到这了。(可惜不能与好兄弟xyx边走边吹水了,希望下次能骑电动车载你回去) (2022.9.28 21:22 A3-404)

数据结构学习——BST删除特定节点的更多相关文章

  1. 数据结构学习-BST二叉查找树 : 插入、删除、中序遍历、前序遍历、后序遍历、广度遍历、绘图

    二叉查找树(Binary Search Tree) 是一种树形的存储数据的结构 如图所示,它具有的特点是: 1.具有一个根节点 2.每个节点可能有0.1.2个分支 3.对于某个节点,他的左分支小于自身 ...

  2. 算法设计和数据结构学习_5(BST&AVL&红黑树简单介绍)

    前言: 节主要是给出BST,AVL和红黑树的C++代码,方便自己以后的查阅,其代码依旧是data structures and algorithm analysis in c++ (second ed ...

  3. 数据结构-链表实现删除全部特定元素x

    链表节点类定义: template <class T> class SingleList; template <class T> class Node { private: T ...

  4. 数据结构:DHUOJ 删除链表的顺数及倒数第N个节点

    删除链表的顺数及倒数第N个节点 作者: turbo时间限制: 1S章节: DS:数组和链表 题目描述: 可使用以下代码,完成其中的removeNth函数,其中形参head指向无头结点单链表,n为要删除 ...

  5. 邓俊辉数据结构学习-7-BST

    二叉搜索树(Binary-Search-Tree)--BST 要求:AVL树是BBST的一个种类,继承自BST,对于AVL树,不做太多掌握要求 四种旋转,旋转是BBST自平衡的基本,变换,主要掌握旋转 ...

  6. 数据结构学习笔记_树(二叉搜索树,B-树,B+树,B*树)

    一.查找二叉树(二叉搜索树BST) 1.查找二叉树的性质 1).所有非叶子结点至多拥有两个儿子(Left和Right): 2).所有结点存储一个关键字: 3).非叶子结点的左指针指向小于其关键字的子树 ...

  7. OSG中找到特定节点的方法

    OSG中找到特定节点的方法 转自:http://38288890.blog.163.com/blog/static/19612845320072721549504/ 为了在OSG中找到需要的节点并对节 ...

  8. 【Java数据结构学习笔记之一】线性表的存储结构及其代码实现

    应用程序后在那个的数据大致有四种基本的逻辑结构: 集合:数据元素之间只有"同属于一个集合"的关系 线性结构:数据元素之间存在一个对一个的关系 树形结构:数据元素之间存在一个对多个关 ...

  9. 用java源代码学数据结构<七>: BST

    /* * 以int类为例 * 其它的类必须能够比较 * */ //二叉搜索树的节点点 class BSTNode{ int item; BSTNode lc; BSTNode rc; BSTNode ...

  10. 数据结构学习-AVL平衡树

    环境:C++ 11 + win10 IDE:Clion 2018.3 AVL平衡树是在BST二叉查找树的基础上添加了平衡机制. 我们把平衡的BST认为是任一节点的左子树和右子树的高度差为-1,0,1中 ...

随机推荐

  1. Logstash:input plugin 介绍

  2. EFK-4::ElasticSearch集群TLS加密通讯

    转载自:https://mp.weixin.qq.com/s?__biz=MzUyNzk0NTI4MQ==&mid=2247483822&idx=1&sn=6813b22eb5 ...

  3. k8s安装常用软件的yaml文件

    参考网址:https://www.bejson.com (网站文件部分有坑,需要擦亮眼睛) nginx k8s版本:v1.20 apiVersion: apps/v1 kind: Deployment ...

  4. 文档的CURD

    Index方式,需要指定ID 如果ID不存在,创建新的文档,状态是created 如果ID存在,会先删除现有ID的文档,然后创建一个新文档,ID数加1,状态是updated PUT test/_doc ...

  5. 配置logstash消费kafka多个topic,分别生成索引

    filebeat配置多个topic #filebeat.prospectors: filebeat.inputs: - input_type: log encoding: GB2312 # field ...

  6. 简书是如何把用户wo逼疯的

    趁验证码还有一分钟时间,吐槽一下简书. 准备开始在简书写文章,遇到一些问题. 一.markdown的问题 1.不支持html 2....... 二.绑定手机--这是一个bug 我原来是使用邮箱注册的, ...

  7. HDU1114 Piggy-Bank (完全背包)

    完全背包模板,和01背包相比不用倒推,因为一种可以选多个. 这道题求最小,dp数组初始化为无穷即可. 1 #include<iostream> 2 #include<cstring& ...

  8. Docker | 容器数据卷详解

    什么是容器数据卷 从docker的理念说起,docker将应用和环境打包成一个镜像,运行镜像(生成容器)就可以访问服务了. 如果数据都存在容器中,那么删除容器,数据就会丢失!需求:数据可以持久化 My ...

  9. JVM运行模式和逃逸分析

    JVM三种运行模式: 解释模式(Interpreted Mode):只使用解释器(-Xint强制JVM使用解释模式),执行一行JVM字节码就编译一行为机器码.(可以马上看到效果,但是运行过程比较慢) ...

  10. 使用ssm框架搭建的图书管理系统

    等下贴代码 学生图书管理系统 实现的功能: 1.图书信息查询(暂时未分页处理) 2.图书信息修改(点击保存按钮后返回修改后的图书信息界面) 3.删除一本图书(删除某一本书籍,在图书管理界面则不存在该条 ...