数据结构学习——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中 ...
随机推荐
- Docker 部署 RocketMQ 双主双从模式( 版本v4.7.0)
文章转载自:http://www.mydlq.club/article/96/ 系统环境: 系统版本:CentOS 7.8 RocketMQ 版本:4.7.0 Docker 版本:19.03.13 一 ...
- 使用 openssl 生成 https 证书, 并在 nginx 中配置 https
创建一个私钥 openssl genrsa -des3 -out server.key 2048 注意:这一步需要输入私钥,否则会提示:You must type in 4 to 1023 chara ...
- Docker 部署 JIRA(破解版)
一. 说明 1.1 素材 本文采用素材如下: Docker镜像 Github链接(https://github.com/cptactionhank) 破解工具 Gitee链接(https://gite ...
- 小白入行安全圈内必须知道的top10
OWASP Top10 前言 每年的Top10都在更新,但是一般不会有太大的改变,这里说明的是 2021年的Top10排行榜. A01:访问控制失效(Broken Access Control) 攻击 ...
- 0-mysql数据库下载及安装
1 下载mysql源安装包 wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm 2 安装mysql源 yu ...
- Netty 学习(六):创建 NioEventLoopGroup 的核心源码说明
Netty 学习(六):创建 NioEventLoopGroup 的核心源码说明 作者: Grey 原文地址: 博客园:Netty 学习(六):创建 NioEventLoopGroup 的核心源码说明 ...
- C言语语法总结(随时更新)
一.gcc1. gcc xxx.c -o xxx #把原代码编译成可执行文件xxx2. gcc -c xxx.c #编译: 把原代码编译xxx.o后辍的目标文件3. gcc xxx.o -o xxx ...
- aws上传文件、删除文件、图像识别
目录 aws的上传.删除s3文件以及图像识别文字功能 准备工作 安装aws cli 初始化配置AWS CLI s3存储桶开通 图像识别文字功能开通 aws的sdk 上传文件 方法一 方法二 删除文件 ...
- 2022年最新最详细的tomcat安装教程和常见问的解决
文章目录 1.官网直接下载 1.1.jdk的版本和tomcat版本应该相对应或者兼容 1.2. 在官网找对应的tomcat版本进行下载 1.3 .根据电脑版本下载64-bit windows zip( ...
- commons-fileupload组件和commons-io组件的详细下载
commons-fileupload组件和commons-io组件的详细下载 1. commons-fileupload组件的下载 下载地址:http://commons.apache.org/fil ...