数据结构学习——BST删除特定节点
BST删除特定节点
前言
- 一个平常的星期三晚上,一节通选课中,在老师放的视频和极寒空调的折磨之下,想着做点别的什么的我,打开了博客园。想起来做题下午数据结构课中老师最后在讲BST删除节点的操作,并且以一种很有意思有条理的方式讲解,我也理解了节点删除操作是怎么实现的。既然现在都那么无聊了,不如就试着回忆一下当时老师的讲解思路并记录下来把。
前提知识
- 要想找到想删除的值对应的节点,不免要利用BST的特点————左子树的值小于根节点的值,右子树的值大于根节点的值,因为想要删除那个节点,要做的第一件事就是找到那个节点。
情景再现(按照我记得的听到的。。。)
- 假如你是某个公司的程序员,老板给你的任务是删除树中某个指定的值对应的节点,又不能破坏BST的结构。
- 第一天,你知道这是个有点难度的任务,于是你决定从简单的情况开始处理。你发现,假如要删除的节点是一个叶子节点(既没有左子树又没有右子树),那要做的操作很简单,只需要将该节点的上一级根节点指向该节点的指针置为NULL即可。完成了这个操作后你很开心,今天的任务完成了可以下班了,而且也好跟老板汇报进度。
- 第二天,解决完最简单的情况后,你试着把条件增加一点,假如要删除的节点只有一个子树(左子树或者右子树),那要做的操作也很简单,只需要将该节点的上一级根节点指向该节点的指针指向该节点的那个唯一的子树就可以了。完成了这个操作之后你又开心又有点不开心,开心是因为今天的任务完成了可以下班了,好跟老板汇报进度,不开心的是能混的日子又少了,准备要面对最难的部分了。
- 第三天,你知道早晚要面对这个问题的,心理也没有那么忐忑了。假如要删除的节点既有左子树又有右子树,那怎么样操作才能完成要求呢?直接删除掉该结点的话会出现一个问题,且不说能不能直接接上去,该用左子树还是右子树去接上上一级根节点呢?接上去之后另一棵子树该怎么处理呢?想到这里,你的心有点乱了,不妨想想,能不能找别的节点代替这个要删除的节点,那么就要引出方法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删除特定节点的更多相关文章
- 数据结构学习-BST二叉查找树 : 插入、删除、中序遍历、前序遍历、后序遍历、广度遍历、绘图
二叉查找树(Binary Search Tree) 是一种树形的存储数据的结构 如图所示,它具有的特点是: 1.具有一个根节点 2.每个节点可能有0.1.2个分支 3.对于某个节点,他的左分支小于自身 ...
- 算法设计和数据结构学习_5(BST&AVL&红黑树简单介绍)
前言: 节主要是给出BST,AVL和红黑树的C++代码,方便自己以后的查阅,其代码依旧是data structures and algorithm analysis in c++ (second ed ...
- 数据结构-链表实现删除全部特定元素x
链表节点类定义: template <class T> class SingleList; template <class T> class Node { private: T ...
- 数据结构:DHUOJ 删除链表的顺数及倒数第N个节点
删除链表的顺数及倒数第N个节点 作者: turbo时间限制: 1S章节: DS:数组和链表 题目描述: 可使用以下代码,完成其中的removeNth函数,其中形参head指向无头结点单链表,n为要删除 ...
- 邓俊辉数据结构学习-7-BST
二叉搜索树(Binary-Search-Tree)--BST 要求:AVL树是BBST的一个种类,继承自BST,对于AVL树,不做太多掌握要求 四种旋转,旋转是BBST自平衡的基本,变换,主要掌握旋转 ...
- 数据结构学习笔记_树(二叉搜索树,B-树,B+树,B*树)
一.查找二叉树(二叉搜索树BST) 1.查找二叉树的性质 1).所有非叶子结点至多拥有两个儿子(Left和Right): 2).所有结点存储一个关键字: 3).非叶子结点的左指针指向小于其关键字的子树 ...
- OSG中找到特定节点的方法
OSG中找到特定节点的方法 转自:http://38288890.blog.163.com/blog/static/19612845320072721549504/ 为了在OSG中找到需要的节点并对节 ...
- 【Java数据结构学习笔记之一】线性表的存储结构及其代码实现
应用程序后在那个的数据大致有四种基本的逻辑结构: 集合:数据元素之间只有"同属于一个集合"的关系 线性结构:数据元素之间存在一个对一个的关系 树形结构:数据元素之间存在一个对多个关 ...
- 用java源代码学数据结构<七>: BST
/* * 以int类为例 * 其它的类必须能够比较 * */ //二叉搜索树的节点点 class BSTNode{ int item; BSTNode lc; BSTNode rc; BSTNode ...
- 数据结构学习-AVL平衡树
环境:C++ 11 + win10 IDE:Clion 2018.3 AVL平衡树是在BST二叉查找树的基础上添加了平衡机制. 我们把平衡的BST认为是任一节点的左子树和右子树的高度差为-1,0,1中 ...
随机推荐
- containerd使用
Docker CLI 工具提供了需要增强用户体验的功能,containerd 同样也提供一个对应的 CLI 工具:ctr,不过 ctr 的功能没有 docker 完善,但是关于镜像和容器的基本功能都是 ...
- 推送本地镜像到Dokcer Hub仓库
# 登陆 [root@docker ~]# docker login # 注意:后面不输入网址 Login with your Docker ID to push and pull images fr ...
- 【前端必会】Prettier,有了ESlint,还要Prettier
介绍 已经安装了ESLint为什么还要Prettier,主要是让ESLint专注于语法相关的验证,检查潜在问题.而代码格式化则有Prettier来接管 对比参考: https://baijiahao. ...
- Python 实现Tracert追踪TTL值
Tracert 命令跟踪路由原理是IP路由每经过一个路由节点TTL值会减一,假设TTL值=0时数据包还没有到达目标主机,那么该路由则会回复给目标主机一个数据包不可达,由此我们就可以获取到目标主机的IP ...
- 18-基于CentOS7搭建RabbitMQ3.10.7集群镜像队列+HaProxy+Keepalived高可用架构
集群架构 虚拟机规划 IP hostname 节点说明 端口 控制台地址 192.168.247.150 rabbitmq.master rabbitmq master 5672 http://192 ...
- 关于csh-C-shell的记录
csh,由柏克莱大学的 Bill Joy 设计的,语法有点类似C语言,所以才得名为 C shell ,简称为 csh Bill Joy 是一个风云人物,他创立了 BSD 操作系统,开发了 vi 编辑器 ...
- 关于aws上ec2机型的种类总结汇总
在aws上ec2的机型是非常多的,但主要的种类为如下几种 General Purpose (通用型) ...
- 我的Vue之旅 07 Axios + Golang + Sqlite3 实现简单评论机制
第三期 · 使用 Vue 3.1 + TailWind.CSS + Axios + Golang + Sqlite3 实现简单评论机制 效果图 CommentArea.vue 我们需要借助js的Dat ...
- 第三方库openPyxl读取excel文件
import openpyxl from openpyxl.worksheet.worksheet import Worksheet def openpyxl_read(): #1.打开文件 work ...
- LcdTools如何编写MIPI指令(初始化代码)
在LcdTools帮助文档中查看MIPI读写指令描述,如下图 编写LCM初始化代码就是配置LCM Driver IC寄存器值,一般只需用MipiWrite()指令写参数即可:下面介绍MipiWrite ...