数据结构——有序二叉树的删除

在上一篇博客中,我们介绍了有序二叉树的构建、遍历、查找。

数据结构——有序二叉树的构建&遍历&查找-CSDN博客文章浏览阅读707次,点赞18次,收藏6次。因为数据的类型决定数据在内存中的存储形式。left right示意为左右节点其类型也为TreeNode,用于接受后续一系列操作,保持了结构的一致性。为什么left和right的类型为TreeNode?我们采用递归的方式实现。我们创建一个test类。https://blog.csdn.net/2301_78566776/article/details/144160961?spm=1001.2014.3001.5501这篇博客我们来介绍一下有序二叉树的删除。

删除操作

删除操作的步骤相对复杂,因为需要处理三种情况:

1.要删除的节点是叶子节点(没有子节点)

删除叶子节点
        1.找到要删除的节点targetNode
        2.找到targetNode的父节点(考虑父节点是否存在)
        3.确定targetNode是parentNode的左子树还是右子树
        4.根据前面的情况进行删除
        左子树:parentNode.left=null;右子树:parentNode.right=null;

2.要删除的节点只有一个子节点

删除有一个子树的节点
        1.找到要删除的节点targetNode
        2.找到targetNode的父节点(考虑父节点是否存在)
        3.确定targetNode是左子树还是右子树
        4.确定targetNode有的是左子树还是右子树
        5.targetNode有的是左子树
                 parentNode.left = targetNode.left;——删除的节点是父节点的左子树
                 parentNode.right = targetNode.left;——删除的节点是父节点的右子树
        6.targetNode有的是右子树:

                 parentNode.left = targetNode.right;——删除的节点是父节点的左子树
                 parentNode.right = targetNode.right;——删除的节点是父节点的右子树       

3.要删除的节点有两个子节点

对于第三种情况,通常的做法是找到要删除节点的中序后继(或中序前驱),将其值替换到要删除的节点上,然后删除这个中序后继(或中序前驱)。

删除有两个子树的节点
        1.找到要删除的节点targetNode
        2.找到targetNode的父节点(考虑父节点是否存在)
        3.去找targetNode的右子树的左子树当中的最小值
        4.将targetNode的值和最小值的值进行互换
        5.删除最小值——即删除叶子节点(替换删除)

Java代码如下:
public TreeNode Search(TreeNode node,int value) {if (node == null) {return null; }if (value==node.data) {return node; }else if(value<node.data){if(node.left!=null) {return Search(node.left,value);}}else {if(node.right!=null) {return Search(node.right,value);}}return null;// TODO Auto-generated method stub}
public TreeNode SearchParent(TreeNode node,int value){if (node == null) {return null; }if((node.left!=null&&node.left.data==value)||(node.right!=null&&node.right.data==value)){return node;}else {if(node.left!=null&&value<node.data) {return SearchParent(node.left,value);}else if(node.right!=null&&value>node.data) {return SearchParent(node.right,value);}else {return null;}}}public int delRightTreeMin(TreeNode node){TreeNode tempNode = node;while (tempNode.left !=null){tempNode = tempNode.left;}return tempNode.data; //最值进行返回}public void delete(TreeNode node,int value){if (node == null) {//空树,直接返回return; }if(node.left==null&&node.right==null) {//单节点树,直接置空node=null;return;}//先查询要删除的节点TreeNode targetNode=Search(node,value);if(targetNode==null) {//没有找到return;}//找父节点TreeNode parentNode=SearchParent(node,value);if(targetNode.left==null&&targetNode.right==null) {//如果targetNode是叶子节点if(parentNode.left!=null&&parentNode.left.data==targetNode.data){//如果target是parent的左子树parentNode.left=null;}else if(parentNode.right!=null&&parentNode.right.data==targetNode.data) {//如果target是parent的右子树parentNode.right=null;}}else if(targetNode.left!= null && targetNode.right!=null) {//如果targetNode有两个子节点int minValue = delRightTreeMin(targetNode.right); //找右子树的最小值delete(targetNode.right,minValue);targetNode.data = minValue;//互换最小值}else { //只有一个子节点的节点if(targetNode.left !=null){ //当前要删除的节点有左子树if(parentNode.left.data == targetNode.data){ //删除的节点是父节点的左子树parentNode.left = targetNode.left;}else {//删除的节点是父节点的右子树parentNode.right = targetNode.left;}}else {//当前要删除的节点有右子树if(parentNode.left.data == targetNode.data){  //删除的节点是父节点的左子树parentNode.left = targetNode.right;}else {//删除的节点是父节点的右子树parentNode.right = targetNode.right;}}}				}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/63355.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

威联通-001 手机相册备份

文章目录 前言1.Qfile Pro2.Qsync Pro总结 前言 威联通有两种数据备份手段&#xff1a;1.Qfile Pro和2.Qsync Pro&#xff0c;实践使用中存在一些区别&#xff0c;针对不同备份环境选择是不同。 1.Qfile Pro 用来备份制定目录内容的。 2.Qsync Pro 主要用来查看和操作文…

线性代数中的谱分解

一、谱分解的基本原理 谱分解&#xff08;Spectral Decomposition&#xff09;是线性代数中的一个重要概念&#xff0c;特别是在研究矩阵的特征值和特征向量时。它指的是将一个矩阵分解为其特征值和特征向量的组合&#xff0c;从而简化矩阵的运算和分析。谱分解通常适用于对称…

C语言学习:速通指针(2)

这里要学习的有以下内容 1. const修饰指针 2. 野指针 3. assert断⾔ 4. 指针的使⽤和传址调⽤ 那么从这里开始 1. const 修饰指针 const修饰变量 首先我们知道变量是可以修改的&#xff0c;如果把变量的地址交给⼀个指针变量&#xff0c;通过指针变量的也可以修改这个变…

dart类和对象

基本定义 类 类是一个包裹多个对象成员的一个整体&#xff0c;可以通过实例化获取类的对象&#xff0c;通过对象操纵内部对象 对象 对象具有由函数和数据&#xff08;分别为方法和 实例变量&#xff09;组成的成员。调用方法时&#xff0c;您会在对象上调用它&#xff1a;该…

使用 MATLAB 绘制三维散点图:根据坐标和距离映射点的颜色和大小

在数据可视化中&#xff0c;三维散点图是一种非常直观的方式来展示数据的分布。MATLAB 提供了强大的 scatter3 函数&#xff0c;可以用来绘制三维散点图&#xff0c;而通过调整点的颜色和大小&#xff0c;可以进一步增强图形的表现力。 在本篇博客中&#xff0c;我们将逐步讲解…

【Vulkan入门】04-开启Debug输出

目录 先叨叨git信息关键代码和主要APIVulkanEnv::SetDebugUtilMessenger()VulkanEnv::CreateVkInstance() 题外话 先叨叨 到上篇为止我们已经作了很多事情了。建立了Instance、挑选了物理设备、建立的Device和Queue。 之前做的都是相对简单和线性的工作&#xff0c;只要认真对…

卷积神经网络(CNN)的层次结构

卷积神经网络&#xff08;CNN&#xff09;是一种以其处理图像和视频数据的能力而闻名的深度学习模型&#xff0c;其基本结构通常包括以下几个层次&#xff0c;每个层次都有其特定的功能和作用&#xff1a; 1. 输入层&#xff08;Input Layer&#xff09;&#xff1a; 卷积神经网…

【深度学习】四大图像分类网络之ResNet

ResNet网络是在2015年由微软实验室中的何凯明等几位提出&#xff0c;在CVPR 2016发表影响深远的网络模型&#xff0c;由何凯明团队提出来&#xff0c;在ImageNet的分类比赛上将网络深度直接提高到了152层&#xff0c;前一年夺冠的VGG只有19层。斩获当年ImageNet竞赛中分类任务第…

美团一面,有点难度

前几天分享过一篇训练营的朋友在阿里的一面面经&#xff0c;挺简单的她也是很轻松的过了&#xff0c;感兴趣的可以看一下我之前发的文章。 今天要分享的还是她的面经&#xff0c;美团的一面&#xff0c;感觉比阿里的难一些&#xff0c;各位观众老爷你怎么看&#xff1f; 自我介…

VS下网络快速连接检测实现

一.问题&#xff1a; VS实现PC软件和单片机的网络连接的时候&#xff0c;如果网线没有插入&#xff0c;检测连接失败&#xff0c;一般设置网络连接为非阻塞方式&#xff0c;但是如果单片机返回比较慢&#xff0c;会导致正常情况下也连不上&#xff0c;下面代码通过 设置等待方…

Windows电脑伪关机(快速启动模式),怎么真关机

Windows电脑在关机的时候&#xff0c;进入到一个伪关机的状态&#xff0c;也就是并没有真正的关机&#xff0c;但是在一些系统更新、变更了一些设置&#xff0c;进行重启等操作也会进入到真关机状态 这种一般是开启快速启动模式&#xff0c;开启了快速启动模式功能会在关机的时…

计算属性computed

使用 export default 的写法&#xff08;Vue 单文件组件&#xff09;和 使用 new Vue() 的写法&#xff08;实例化 Vue&#xff09;二者之间的区别&#xff1a; 1. 使用 export default 的写法&#xff08;Vue 单文件组件&#xff09; 这种写法常用于 Vue 的单文件组件&#xf…

【开发文档】资源汇总,持续更新中......

文章目录 AI大模型数据集PytorchPythonUltralyticsOpenCVNetronSklearnCMakeListsNVIDIADocker刷题网站持续更新&#xff0c;欢迎补充 本文汇总了一些常用的开发文档资源&#xff0c;涵盖了常用AI大模型、刷题网站、Python、Pytorch、OpenCV、TensorRT、Docker 等技术栈。通过这…

element Plus中 el-table表头宽度自适应,不换行

在工作中&#xff0c;使用el-table表格进行开发后&#xff0c;遇到了小屏幕显示器上显示表头文字会出现换行展示&#xff0c;比较影响美观&#xff0c;因此需要让表头的宽度变为不换行&#xff0c;且由内容自动撑开。 以下是作为工作记录&#xff0c;用于demo演示教程 先贴个…

模型预测控制(Model Predictive Control)

学习模型预测控制的几个阶段&#xff1a; 1.迷茫&#xff0c;一头雾水&#xff0c;立刻忘记: 一个易懂的MPC理论推导过程教程 2.感兴趣&#xff0c;知道了大概讲些什么东西&#xff0c;但是不知道如何应用: 一个系统讲解MPC的入门教程1 3.开始深度学习&#xff1a; 待续…

2021高等代数【南昌大学】

证明多项式 f ( x ) = 1 + x + x 2 2 ! + ⋯ + x n n ! f(x) = 1 + x + \frac{x^2}{2!} + \cdots + \frac{x^n}{n!} f(x)=1+x+2!x2​+⋯+n!xn​ 无重根。f ( x ) − f ′ ( x ) = x n n ! f(x) - f(x) = \frac{x^n}{n!} f(x)−f′(x)=n!xn​ ( f ( x ) , f ′ ( x ) ) = ( f (…

鸿蒙Next通过oss上传照片到阿里云

前言 最近在写纯血鸿蒙的APP&#xff0c;需要用到oss上传照片&#xff0c;之前的客户端 Android 和 IOS 都已经实现了&#xff0c;获取的阿里云签名的上传地址是服务端实现的&#xff0c;相信大部分公司都是这样的模式&#xff0c;服务端也是调用阿里云的SDK来实现的&#xff…

三维测量与建模笔记 - 5.3 光束法平差(Bundle Adjustment)

此篇笔记尚未理解&#xff0c;先做笔记。 如上图&#xff0c;在不同位姿下对同一个物体采集到了一系列图像&#xff0c; 例子中有四张图片。物体上某点M&#xff0c;在四幅图像上都能找到其观测点。 上式中的f函数是对使用做投影得到的估计点位置。求解这个方程有几种方法&…

C++学习0.2: RAII

引用&#xff1a; 【代码质量】RAII在C编程中的必要性_raii 在c中的重要性-CSDN博客 C RAII典型应用之lock_guard和unique_lock模板_raii lock-CSDN博客 前言: 常用的线程间同步/通信&#xff08;IPC&#xff09;方式有锁&#xff08;互斥锁、读写锁、自旋锁&#xff09;、…

【NLP 10、优化器 ① SGD 随机梯度下降优化器】

目录 一、定义 二、什么是梯度下降 三、SGD的工作原理 四、SGD的优化公式&#xff08;更新规则&#xff09; 五、SGD的优缺点 优点 缺点 六、如何选择学习率 七、使用SGD优化器训练一个简单的线性回归模型 祝你 随时攥紧偶然 永远拥有瞬间 —— 24.12.6 一、定义 随机梯度下降…