数据结构学习——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中 ...
随机推荐
- Kibana探索数据(Discover)
总结说明: 1.先在Management/Kibana/Index Patterns 界面下添加索引模式(前提是有索引数据) 2.在Discover界面选中响应的索引模式 3.开启Kibana 查询语 ...
- Docker网络详细理解-容器网络互通
这篇文章主要解决以下几个问题: 1.同一个网段的容器互相之间通过ip进行ping通 2.同一个网段的容器互相之间通过容器名,通过使用--link进行ping通,已放弃这种方法 3.同一个网段的容器互相 ...
- Docker搭建自己的Gitlab CI Runner
转载自:https://cloud.tencent.com/developer/article/1010595 1.Gitlab CI介绍 CI:持续集成,我们通常使用CI来做一些自动化工作,比如程序 ...
- SpringBoot 常用读取配置文件的 3 种方法!
我们在SpringBoot框架进行项目开发中该如何优雅的读取配置呢?或者说对于一些List或者Map应该如何配置呢? 本篇主要解决如下几个问题: 1.Spring Boot有哪些常用的读取配置文件方式 ...
- 用深度强化学习玩FlappyBird
摘要:学习玩游戏一直是当今AI研究的热门话题之一.使用博弈论/搜索算法来解决这些问题需要特别地进行周密的特性定义,使得其扩展性不强.使用深度学习算法训练的卷积神经网络模型(CNN)自提出以来在图像处理 ...
- 洛谷P2517 HAOI2010 订货 (费用流)
标准的费用流问题,关键在于巧妙地建模 一共有n个月份,源点设为0,汇点设为n+1 1.源点向所有月份连边,容量为正无穷,费用为该月进货的费用 2.每个月向下一个月连边,容量为仓库容量,费用为存货费用 ...
- 糟了,线上服务出现OOM了
前言 前一段时间,公司同事的一个线上服务OOM的问题,我觉得挺有意思的,在这里跟大家一起分享一下. 我当时其实也参与了一部分问题的定位. 1 案发现场 他们有个mq消费者服务,在某一天下午,出现OOM ...
- 分布式存储系统之Ceph集群RadosGW基础使用
前文我们了解了MDS扩展相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16759585.html:今天我们来聊一聊RadosGW的基础使用相关话题: ...
- 会话跟踪技术 - Cookie 和 Session 快速上手 + 登陆注册案例
目录 1. 会话跟踪技术概述 2. Cookie 2.1 Cookie的概念和工作流程 2.2 Cookie的基本使用 2.3 Cookie的原理分析 2.4 Cookie的使用细节 2.4.1 Co ...
- 关于.Net 7.0 RC gRPC JSON 转码为 Swagger/OpenAPI文档的注意事项
大家好,我是失业在家,正在找工作的博主Jerry,找工作之余,看到.Net 7.0 RC2发布了,就想测试下.Net 7.0 RC2 gRPC JSON 转码为 Swagger/OpenAPI文档的特 ...