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. Beats:使用 Elastic Stack 记录 Python 应用日志

    文章转载自:https://elasticstack.blog.csdn.net/article/details/112259500 日志记录实际上是每个应用程序都必须具备的功能.无论你选择基于哪种技 ...

  2. centos yum安装docker

    cd /etc/yum.repos.d/ mv CentOS-Base.repo CentOS-Base.repo_bak wget -O /etc/yum.repos.d/CentOS-Base.r ...

  3. NSIS V3.08 简体中文增强版

    说明: 该3.08版本属本人业余时间集成修改制作,首发博客园,欢迎反馈安装与使用中出现的BUG,转载请注明出处! 本版本母版源自NSIS(Nullsoft Scriptable Install Sys ...

  4. 洛谷P1656 炸铁路 (求割边)

    用tarjan变种求割边的模板题 其实还可以求出所有的边双(用栈),但本题不需要求. 1 #include<bits/stdc++.h> 2 using namespace std; 3 ...

  5. 将Java代码打包成jar文件转换为.exe可执行程序方法

    ​ 做完学生管理系统后我想将代码打包成一个可执行程序,那样就可以直接点击在Windows下运行了,下面就跟大家分享下打包方法. 将Java的代码转换成 .exe 文件需要先把代码打包成 jar 文件然 ...

  6. 基于vite3+tauri模拟QQ登录切换窗体|Tauri自定义拖拽|最小/大/关闭

    前两天有给大家分享tauri+vue3快速搭建项目.封装桌面端多开窗口.今天继续来分享tauri创建启动窗口.登录窗口切换到主窗口及自定义拖拽区域的一些知识.希望对想要学习或正在学习的小伙伴有些帮助. ...

  7. python关于Django搭建简单博客项目 详解二-setting.py

    这一篇我们来讲解setting.py,具体内容以注释形式写入到下面的setting.py代码中,篇幅所限已把官方所给英文注释删除. 全部源代码和详解请参看http://github.com/Cheng ...

  8. 41.SessionAuthenticatio和自定义认证

    SessionAuthentication认证介绍 SessionAuthentication使用了Django默认的会话后端 适合AJAX客户端等运行在同样会话上下文环境中的模式 是DRF默认的认证 ...

  9. 基于docker和cri-dockerd部署kubernetes v1.25.3

    基于docker和cri-dockerd部署kubernetes v1.25.3 1.环境准备 1-1.主机清单 主机名 IP地址 系统版本 k8s-master01 k8s-master01.wan ...

  10. ES6高级编程(一)

    一.JavaScript概要 1.1.JavaScript组成 JavaScript主要由三部分构成,分别是ECMAScript.DOM与BOM ECMAScript定义了该语言的语法.类型.语句.关 ...