二叉树的删除要考虑三种情况
1.删除的节点是叶子节点2.删除的节点只有一个子树3.删除的节点有两个子树

删除的节点是叶子节点
找到删除的叶子结点tNode
找到目标节点的父节点pNode(考虑是否有父节点)
找到删除节点是父节点的左子树还是右子树
根据前边情况进行删除
右子树:p.rc=null
左子树:p.lc=null

删除的节点只有一个子树
找到删除的叶子结点tNode
找到目标节点的父节点pNode(考虑是否有父节点)
找到删除节点是父节点的左子树还是右子树
确定删除节点是左子树还是右子树
根据前边情况进行删除
tNode是它父节点的左子树
tNode有左子树 : pNode.lc=tNode.lc
tNode有右子树 : pNode.lc=tNode.rc
tNode是是它父节点的右子树
tNode有左子树 : pNode.rc=tNode.lc
tNode有右子树 : pNode.rc=tNode.rc

删除的节点有两个子树
找到删除的叶子结点tNode
找到目标节点的父节点pNode(考虑是否有父节点)
找到删除节点右子树中最小的或找到左子树中最大的
将右子树当中最大的值替换掉删除节点的值
使删除叶子节点的逻辑,删除最小值

//找到要删除的节点public TreeNode searchDelnode(TreeNode node,Integer val) {if(node==null) {return null;}if(node.val==val) {return node;}else if(val>node.val){if(node.rightNode==null) {return null;}return searchDelnode(node.rightNode, val);}else {if(node.leftNode==null) {return null;}return searchDelnode(node.leftNode, val);}}
//找到要删除节点的父节点public TreeNode searchDelpartent(TreeNode node,Integer val) {if(node==null) {return null;}if((node.leftNode!=null&&node.leftNode.val==val)||(node.rightNode!=null&&node.rightNode.val==val)) {return node;}else {if(node.leftNode!=null&&val<node.val) {return searchDelpartent(node.leftNode, val);}else if(node.rightNode!=null&&val>node.val){return searchDelpartent(node.rightNode, val);}else {return null;}}}
//二叉树删除节点public void del(TreeNode node,Integer val) {if(node==null) {return;}//1.找到要删除的节点TreeNode targetNode=searchDelnode(node, val);//2.没有找到要删除的节点if(targetNode==null) {return;}//3.找到要删除节点的父节点TreeNode parentNode=searchDelpartent(node, val);if(node.rightNode==null&&node.leftNode==null) {root=null;return;}if(parentNode==null&&(targetNode.rightNode!=null||targetNode.leftNode!=null)) {int min=searchRightMin(targetNode.rightNode);targetNode.val=min;return;}if(targetNode.leftNode==null&&targetNode.rightNode==null) {if(parentNode.rightNode!=null&&parentNode.rightNode.val==targetNode.val) {parentNode.rightNode=null;}else if(parentNode.leftNode!=null&&parentNode.leftNode.val==val){parentNode.leftNode=null;}}else if(targetNode.leftNode!=null&&targetNode.rightNode!=null) {//在删除节点由左右两个子树时,我们选择找删除节点右子树的最小值,我们可以写一个方法,在这个方法里不仅找到最小值,并把这个位置的元素进行删除int min=searchRightMin(targetNode.rightNode);targetNode.val=min;}else {if(targetNode.rightNode!=null) {if(parentNode.rightNode.val==targetNode.val) {parentNode.rightNode=targetNode.rightNode;}else {parentNode.leftNode=targetNode.rightNode;}}else{if(targetNode.rightNode.val==targetNode.val) {parentNode.rightNode=targetNode.leftNode;}else {parentNode.leftNode=targetNode.leftNode;}}}}

java二叉树删除节点相关推荐

  1. 最完整二叉树删除节点

    二叉树删除节点 在自己研究二叉树删除节点时,查网上资料时发现,网上大部分写的都是错的,主要错在当删除的节点既存在左子树,又存在右子树时,在中序遍历后获取后继节点后,大部分文章未考虑后继节点存在右子树的 ...

  2. 对java 链表删除节点 引用误区理解:对局部变量 cur= cur.next及cur.next=cur.next.next,及cur.next = cur.next.next.next的理解图解

    对java 链表删除节点 引用误区理解: 对java 链表删除节点 引用误区理解: 对局部变量 cur= cur.next及cur.next=cur.next.next,及cur.next = cur ...

  3. 二叉树删除节点以及前中后序遍历

    public class BinaryTreeDemo {public static void main(String args[]){Employee emp1= new Employee(1,&q ...

  4. java json删除节点_指定json的某个节点进行增、删、改

    有时候我们需要对json结构的数据进行更新,或增,或改,或删. 当json层级比较复杂时操作起来是比较麻烦的,得一层层找下去找到要更新的节点才能操作它. 我用python语言封装了一个类,提供三个函数 ...

  5. java二叉树插入节点_[javaSE] 数据结构(二叉查找树-插入节点)

    public class BSTree>{private BSTNodemRoot;/*** 定义二叉树 * *@authortaoshihan *@param **/ public class ...

  6. java二叉树删除子树_132-BST删除有一颗子树的结点

    2.网上数据结构和算法的课程不少,但存在两个问题: 1)授课方式单一,大多是照着代码念一遍,数据结构和算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了 2) ...

  7. 二叉树删除节点,(查找二叉树最大值节点)

    从根节点往下分别查找左子树和右子树的最大节点,再比较左子树,右子树,根节点的大小得到结果,在得到左子树和右子树最大节点的过程相似,因此可以采用递归的 //树节点结构 public class Tree ...

  8. 二叉树删除节点+思路分析

    思路分析 代码实现 ![在这里插入代码片](https://img-blog.csdnimg.cn/20210325193201194.png?x-oss-process=image/watermar ...

  9. java 二叉树的高度_吃透Java集合系列十二:TreeMap

    一:TreeMap整体认识 我们知道HashMap,它保证了以O(1)的时间复杂度进行增.删.改.查,从存储角度考虑,这两种数据结构是非常优秀的.但是HashMap还是有自己的局限性----**它不具 ...

  10. 数据算法之二叉树删除(BinaryTreeL Remove)的Java实现

    本文的代码来自于<数据结构与算法(JAVA语言版)>,是笔者在网上找到的资料,非正式出刊版物.笔者对代码一些比较难以理解的部分添加了注释和图解,欢迎大家来讨论. 二叉树删除要分为三种情况. ...

最新文章

  1. Image-to-Image的论文汇总
  2. 【转载】常用DOS命令(包括创建删除文件夹/文件)
  3. 华为为什么能成全球第一?告诉你三个真相!
  4. 获取 当前日期、当前时间、前一天日期
  5. 前端常用效果(3)带动画的比较型柱状图
  6. 重新理解“失败是成功他妈”
  7. 夏令营提高班上午上机测试 Day 1 解题报告
  8. 神经网络ANN分类器及OpenCV实现
  9. 快来加入阿里云大学【云学院】班级助理—机会稍纵即逝,错过遥遥无期
  10. 基于生物特征识别认证方式对应2020版《个人信息安全规范》的解读-1
  11. js pdf文件 如何调用打印机打印_pdf.js —— 在线预览下载打印pdf文件插件,实现的两种方式...
  12. 14款开源或免费的GIS软件
  13. 【0514 更新中】CVPR 2019 论文汇总 按方向划分
  14. 早早起来真的可以做许多事,比如再睡一觉
  15. 【用pandas_alive几行代码绘制竞赛动图】全网首发pandas_alive数据可视化中文学习笔记合集,学不会来打我(配置好的venv虚拟环境+拿来即用测试代码+测试数据集+参数api解析)
  16. doolittle分解法解线性方程
  17. *2-3 OJ 1164 导弹拦截之升级版
  18. Citrix 桌面虚拟化解决方案与VMware桌面虚拟化解决方案对比
  19. Android中的elevation
  20. 易语言5.9破解方法

热门文章

  1. 雨滴win7计算机路径,win7雨滴桌面秀 Raindrop Desktop Show教程_计算机软件和应用程序_IT /计算机_信息...
  2. DotNetBar的使用—(Office2007界面风格)
  3. 评委对计算机知识竞赛的提问,评委评分知识竞赛答题软件
  4. 如何解决端口冲突的问题???
  5. Matlab中freqz函数使用
  6. SVN客户端——SmartSVN功能详解
  7. 盘点微信的前世今生,微信成功的必然和偶然
  8. knockoutjs的某些坑总结
  9. matlab构造arma模型,ARMA模型构建及MATLAB实现
  10. CryptoJS 加解密类库的简单用法