树--排序二叉树的删除

一、二叉排序树的删除

二叉排序树的删除情况比较复杂,有以下三种情况需要考虑。

  1. 删除叶子节点 (比如:2,5,9,10)
  2. 删除只有一个子树的节点(比如:1)
  3. 删除有两个子树的节点 (比如:7,3,10)

分析情况一

删除叶子节点 (比如:2,5,9,10)思路:

分析情况二

删除只有一个子树的节点(比如:1)思路:

分析情况三

删除有两个子树的节点 (比如:7,3,10)思路:

二、代码实现

1.查找相应的节点

/**** @param value  希望删除的节点值* @return       如果找到返回该节点值,找不到返回null*/
public TreeNode search(TreeNode node,int value){if(root == null){return null;}// 找到的就是这个节点if(value == node.getValue()){return node;}else if(value < node.getValue()){ //如果查找的值小于当前节点向左子树递归查找// 判断左子树是否为空if(node.getLeftTreeNode() == null){return  null;}return search(node.getLeftTreeNode(),value);}else {if(node.getRightTreeNode() == null){return null;}return search(node.getRightTreeNode(),value);}}

2.查找节点的父节点

/***  查找节点的父节点* @param node   父节点* @param value  节点的值* @return       父节点*/
public TreeNode SearchParent(TreeNode node,int value) {// 当前树为空树if(root == null){return null;}// 如果当前节点就是我们想要删除的节点的父节点,就返回if((node.getLeftTreeNode() != null && node.getLeftTreeNode().getValue() == value) ||(node.getRightTreeNode() !=null && node.getRightTreeNode().getValue() == value)){return node;}else {// 如果当前节点的值小于当前节点的值,并且当前节点的左子树不为空if(  node.getLeftTreeNode() !=null && value < node.getValue()){return SearchParent(node.getLeftTreeNode(),value); //左子树递归查找}else if( node.getRightTreeNode() !=null && value > node.getValue()){return SearchParent(node.getRightTreeNode(),value);//右子树递归查找}else {return null; // 没有找到父节点}}
}

3.找到右子树当中的最小值

/*** 找到右子树当中的最小值** @param node 节点* @return     节点最小值*/
public int delRightTreeMin(TreeNode node){//定义遍历的指针TreeNode target = node;// 循环的查询左子树,就会找到最小值while (target.getLeftTreeNode() !=null){target = target.getLeftTreeNode();}// 此时 target 执向最小值// 删除最小的节点 //这个地方传值要注意:一定是root// 因为如果传的值是parent是没有父节点的,会导致 父节点没有办法和子节点相连delNode(root,target.getValue());return target.getValue();
}

4.删除方法的实现


/*** 删除方法* @param node* @param value*/
public void delNode(TreeNode node,int value){if(node == null){return;}//1.找到先删除的节点TreeNode targetNode = search(node,value);//如果没有找到要删除的节点if(targetNode == null){return;}//如果我们发现这颗二叉树只有一个节点if(node.getLeftTreeNode() == null && node.getRightTreeNode() == null){// 删除root = null;return;}// 找到targetNode的父节点TreeNode parent = SearchParent(node,value);//如果要删除的节点是叶子节点if(targetNode.getLeftTreeNode() == null && targetNode.getRightTreeNode() == null){// 判断targetNode是父节点的左子节点还是右子节点if(parent.getLeftTreeNode() !=null && parent.getLeftTreeNode().getValue() == value){parent.setLeftTreeNode(null);}else if(parent.getRightTreeNode() !=null && parent.getRightTreeNode().getValue() == value){parent.setRightTreeNode(null);}}else if(targetNode.getLeftTreeNode() != null && targetNode.getRightTreeNode() !=null){//删除有两颗子树的节点//System.out.println(targetNode.getValue());int minValue = delRightTreeMin(targetNode.getRightTreeNode());targetNode.setValue(minValue);}else {  //删除只有一颗子树的节点//如果要删除的节点有左子节点if(targetNode.getLeftTreeNode() !=null){if(parent.getLeftTreeNode().getValue() == value){//如果targetNode是parent的左子节点parent.setLeftTreeNode(targetNode.getLeftTreeNode());}else {  //如果targetNode是parent的右子节点parent.setRightTreeNode(targetNode.getLeftTreeNode());}}else {System.out.println("parent:"+parent);if(parent.getLeftTreeNode().getValue() == value){//如果targetNode是parent的左子节点parent.setLeftTreeNode(targetNode.getRightTreeNode());}else {//如果targetNode是parent的右子节点parent.setRightTreeNode(targetNode.getRightTreeNode());}}}}

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

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

相关文章

YAPI第一次创建项目

黑马程序员JavaWeb开发教程 文章目录 1、添加项目2、添加分类3、添加接口 1、添加项目 2、添加分类 3、添加接口

数据结构:线性表————单链表专题

&#x1f308;个人主页&#xff1a;小新_- &#x1f388;个人座右铭&#xff1a;“成功者不是从不失败的人&#xff0c;而是从不放弃的人&#xff01;”&#x1f388; &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f3c6;所属专栏&#xff1…

STM32的GPIO端口的八种模式解析

目录 STM32的GPIO端口的八种模式解析 一、上拉输入模式 二、下拉输入模式 三、浮空输入模式 四、模拟输入模式 五、推挽输出模式 六、开漏输出模式 七、复用推挽输出模式 八、复用开漏输出模式 STM32的GPIO端口的八种模式解析 在学习STM32的过程中&#xff0c;GPIO端口…

最全面的多语言同城送餐app开发流程解析

在当今数字化时代&#xff0c;随着移动互联网的普及和人们生活水平的提高&#xff0c;多语言同城送餐app开发成为各大企业争相布局的热门领域。本文将从专家的视角出发&#xff0c;为您详细解析最全面的多语言同城送餐app开发流程&#xff0c;助您在激烈的竞争中脱颖而出。 多…

使用colab进行yolov5小demo练习

输入一张动物的图片进行目标检测和分类 !pip install yolov5 import torch from PIL import Image from torchvision import transforms from yolov5.models.experimental import attempt_load from yolov5.utils.general import non_max_suppression# 加载YOLOv5模型 device …

婴儿专用洗衣机哪个牌子比较好?四款品质婴儿洗衣机暖心安利

科技让我们的生活变得方便了许多&#xff0c;比如&#xff0c;自从有了婴儿洗衣机之后&#xff0c;有些人就改变了宝宝衣物必须要手洗的想法&#xff0c;许多研究也证明&#xff0c;单靠手洗是无法将宝宝衣物彻底清洗干净的&#xff0c;一台专门的洗衣机就可以减轻我们的负担&a…

【MySQL笔记】InnoDB的插入缓存+非聚簇索引插入的离散性理解

文章目录 为什么需要插入缓存Insert Buffer非聚簇索引插入的离散性 Insert Buffer查看Insert Buffer信息 Insert Buffer的问题Change Buffer总结Reference 为什么需要插入缓存Insert Buffer 磁盘中的主键索引由于天然自增&#xff0c;无须磁盘的随机 I/O&#xff0c;只需不断追…

聚观早报 | 2024款蔚来ET7将发布;魏建军直播测试长城汽车

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 4月16日消息 2024款蔚来ET7将发布 魏建军直播测试长城汽车 Redmi Turbo 3开启销售 华为P系列正式升级为华为Pura…

数据采集1688官方API商品数据采集1688官方商品详情数据返回|电商API接口数据采集

随着全球经济一体化和电子商务的快速发展&#xff0c;网络购物的需求日益增加。不断涌现的电商企业使得行业的竞争情况愈演愈烈。在这种情况下&#xff0c;企业不仅要加大经营力度&#xff0c;还要在自己的基础设施和技术上持续投入&#xff0c;才能更好的适应市场和消费习惯。…

开春运动正当时,谨防这些运动损伤,别让“健身”变“伤身”

春季运动正当时 运动损伤需警惕 科学运动 快乐加倍 天气回升&#xff0c;春暖清明 户外运动爱好者纷纷复出 但要注意的是 春季是运动受伤的高发季 因为经过寒冷冬季的“运动低潮期”&#xff0c;身体各器官的季节活跃性较低&#xff0c;运动方式和强度不合适很容易导致身体…

C++(运算符重载+赋值拷贝函数+日期类的书写)

目录 运算符重载运算赋值重载和运算赋重载前置和后置<,<,>,>,,!运算符重载日期类的实现<<流插入和>>流提取的运算符重载总结 运算符重载 C为了增强代码的可读性引入了运算符重载&#xff0c;运算符重载是具有特殊函数名的函数&#xff0c;也具有其 返回…

(最新)华为 2024 届实习招聘-硬件通⽤/单板开发——第十一套和十二套

&#xff08;最新&#xff09;华为 2024 届实习招聘-硬件通⽤/单板开发——第十一套和十二套 部分题目分享&#xff0c;完整版带答案(有答案和解析&#xff0c;答案非官方&#xff0c;未仔细校正&#xff0c;仅供参考&#xff09;&#xff08;共十套&#xff09;获取&#xff…

【软考】设计模式之命令模式

目录 1. 说明2. 应用场景3. 结构图4. 构成5. 优缺点5.1 优点5.2 缺点 6. 适用性7.java示例 1. 说明 1.命令模式&#xff08;Command Pattern&#xff09;是一种数据驱动的设计模式。2.属于行为型模式。3.请求以命令的形式被封装在对象中&#xff0c;并传递给调用对象。4.调用对…

Win10 启动时数字键盘不亮怎么办?

首先&#xff0c;按住winr 运行 windows 运行框&#xff0c;输入regedit 打开注册表编辑器 1.查找current_user选项下的Control Panel 中的keyboard 点击八initialkeyboard 值设置成2&#xff0c;如图所示即可。2.选择hkey_user 中的。default 下的control Panel 选项下的keyb…

工作中用Redis最多的10种场景

作者&#xff1a;苏三说技术 链接&#xff1a;https://juejin.cn/post/7325132133168971813 前言 Redis是一种非常优秀的基于KV的键值对缓存数据库&#xff0c;有非常不错的性能和稳定性&#xff0c;无论是在工作中&#xff0c;还是在面试中&#xff0c;都经常会出现。因此&am…

UC网盘、迅雷网盘拉新如何做?热门拉新项目盘点

迅雷网盘拉新项目&#xff1a; ​关键词链接 双重拉新模式&#xff1a;可以通过链接、关键词两种方式进行推广&#xff0c;匹配不同拉新场景。 网盘功能齐全&#xff1a;作为老牌网盘产品&#xff0c;功能强大&#xff0c;使用体验好&#xff0c;支持不同格式文件。 不限推广…

【七 (2)FineBI FCP模拟试卷-平台新增用户留存分析】

目录 文章导航一、字段解释1、用户平台登录信息表格2、用户平台激活信息表格 二、需求三、操作步骤1、建立用户平台登录信息表格和用户平台激活信息表格的关联关系2、将用户平台激活信息表格的激活日期添加到用户平台登录信息表格3、新增公式列&#xff0c;计算激活时间和登录时…

OpenHarmony轻量系统开发【5】驱动之GPIO点灯

5.1点灯例程源码 先看最简单得LED灯闪烁操作 源码结构如下&#xff1a; 第一个BUILD.gn文件内容&#xff1a; static_library("led_demo") {sources ["led_demo.c"]include_dirs ["//utils/native/lite/include","//kernel/liteos_m/c…

工业物联网让“制造”变成“智造”!——青创智通

工业物联网解决方案-工业IOT-青创智通 随着科技的不断进步和工业的持续发展&#xff0c;物联网&#xff08;IoT&#xff09;技术的出现为制造业带来了前所未有的变革。工业物联网&#xff08;IIoT&#xff09;作为物联网技术在工业领域的应用&#xff0c;正在逐渐改变传统的制…

@Transactional使用中的三类坑

我们知道事务有声明式事务和编程式事务两种&#xff0c;编程式事务代码侵入较高&#xff0c;声明式事务侵入较低&#xff0c;在项目中常有使用&#xff0c;然而&#xff0c;不正确的使用声明式事务&#xff0c;可能让代码未能按照我们的预期执行。 一、事务可能没有生效 Tran…