一、删除规则

  1. 如果删除的节点是叶子节点,则删除该节点

  2. 如果删除的节点是非叶子节点,则删除该子树.

注意到时候学习二叉排序树的时候删除非叶子结点就不是这样了

二、删除结点思路分析

三、代码实现

package cn.zzw.algorithm.Tree;public class BinaryTreeDemo {public static void main(String[] args) {//想创建一棵二叉树BinaryTree binaryTree=new BinaryTree();//创建需要的结点HeroNode root=new HeroNode(1,"宋江");HeroNode node2=new HeroNode(2,"吴用");HeroNode node3=new HeroNode(3,"卢俊义");HeroNode node4=new HeroNode(4,"林冲");HeroNode node5=new HeroNode(5,"关胜");//手动创建二叉树root.setLeft(node2);root.setRight(node3);node3.setRight(node4);node3.setLeft(node5);binaryTree.setRoot(root);//测试前序遍历//System.out.println("前序遍历");//binaryTree.preOrder();//测试中序遍历//System.out.println("中序遍历");//binaryTree.infixOrder();//测试后序遍历//System.out.println("后序遍历");//binaryTree.postOrder();//测试先序遍历查找//先序遍历查找的次数:4次/*System.out.println("前序遍历方式");HeroNode resNode=binaryTree.preOrderSearch(5);if(resNode!=null){System.out.printf("找到了,信息为 no=%d name=%s", resNode.getNo(), resNode.getName());}else{System.out.printf("没有找到 no = %d 的英雄", 5);}System.out.println("=========================");*///测试中序遍历查找//中序遍历查找的次数:3次/*System.out.println("中序遍历方式");HeroNode resNode=binaryTree.infixOrderSearch(5);if(resNode!=null){System.out.printf("找到了,信息为 no=%d name=%s", resNode.getNo(), resNode.getName());}else{System.out.printf("没有找到 no = %d 的英雄", 5);}System.out.println("=========================");*///测试中序遍历查找//中序遍历查找的次数:2次/*System.out.println("后序遍历方式");HeroNode resNode=binaryTree.postOrderSearch(5);if(resNode!=null){System.out.printf("找到了,信息为 no=%d name=%s", resNode.getNo(), resNode.getName());}else{System.out.printf("没有找到 no = %d 的英雄", 5);}System.out.println("=========================");*///测试删除结点操作System.out.println("删除前,前序遍历");binaryTree.preOrder();binaryTree.delNode(5);System.out.println("删除结点后进行前序遍历");binaryTree.preOrder();}
}//创建二叉树
class BinaryTree
{private HeroNode root;public void setRoot(HeroNode root){this.root=root;}//前序遍历public void preOrder(){if (this.root!=null){this.root.preOrder();}else{System.out.println("二叉树为空,不能遍历");}}//中序遍历public void infixOrder(){if(this.root!=null){this.root.infixOrder();}else{System.out.println("二叉树为空,不能遍历");}}//后序遍历public void postOrder(){if(this.root!=null){this.root.postOrder();}else{System.out.println("二叉树为空,不能遍历");}}//先序遍历查找public HeroNode preOrderSearch(int no){if(root!=null){return this.root.preOrderSearch(no);}else{return null;}}//进行中序遍历public HeroNode infixOrderSearch(int no){if(root!=null){return this.root.infixOrderSearch(no);}else{return null;}}//进行后序遍历public HeroNode postOrderSearch(int no){if(root!=null){return this.root.postOrderSearch(no);}else{return null;}}//进行删除结点操作public void delNode(int no){if(root!=null){if(root.getNo()==no){root=null;}else{root.delNode(no);}}else{System.out.println("空数,不能删除");}}
}//创建HeroNode结点,模拟树的结点
class HeroNode
{private int no;private String name;private HeroNode left;//默认nullprivate HeroNode right;//默认nullpublic HeroNode(int no, String name) {this.no = no;this.name = name;}public int getNo() {return no;}public void setNo(int no) {this.no = no;}public String getName() {return name;}public void setName(String name) {this.name = name;}public HeroNode getLeft() {return left;}public void setLeft(HeroNode left) {this.left = left;}public HeroNode getRight() {return right;}public void setRight(HeroNode right) {this.right = right;}@Overridepublic String toString() {return "HeroNode{" +"no=" + no +", name='" + name + '\'' +'}';}//编写前序遍历的方法public void preOrder(){//先输出父节点System.out.println(this);if(this.left!=null){//如果左子树不为空,就递归向左子树进行先序遍历this.left.preOrder();}if(this.right!=null){//如果右子树不为空,就递归向右子树进行先序遍历this.right.preOrder();}}//中序遍历public void infixOrder(){//递归向左子树进行中序遍历if(this.left!=null){this.left.infixOrder();}//输出父节点System.out.println(this);//递归向右子树进行中序遍历if(this.right!=null){this.right.infixOrder();}}//后序遍历public void postOrder(){if(this.left!=null){this.left.postOrder();}if (this.right!=null){this.right.postOrder();}System.out.println(this);}//先序遍历查找public HeroNode preOrderSearch(int no){System.out.println("进入先序遍历");//比较当前结点是不是要找的结点if(this.no==no){return this;}//1.则判断当前结点的左子节点是否为空,如果不为空,则递归前序查找//2.如果左递归前序查找,找到结点,则返回HeroNode resNode=null;if(this.left!=null){resNode=this.left.preOrderSearch(no);}if(resNode!=null){//说明在左子树上找到该节点return resNode;}//1.左递归前序查找,找到结点,则返回,否继续判断//2.当前的结点的右子节点是否为空,如果不空,则继续向右递归前序查找if(this.right!=null){resNode=this.right.preOrderSearch(no);}return resNode;}//中序遍历查找public HeroNode infixOrderSearch(int no){HeroNode resNode=null;//判断当前结点的左子节点是否为空,如果不为空,则递归中序查找if(this.left!=null){resNode=this.left.infixOrderSearch(no);}if(resNode!=null){return resNode;}System.out.println("进入中序查找");//如果找到,则返回,如果没有找到,就和当前结点比较,如果是则返回当前结点if(this.no==no){return this;}//否则向右进行递归查找if(this.right!=null){resNode=this.right.infixOrderSearch(no);}return resNode;}//进行后序遍历查找public HeroNode postOrderSearch(int no){HeroNode resNode=null;if(this.left!=null){resNode=this.left.postOrderSearch(no);}if(resNode!=null){return resNode;}//如果左子树没有找到,则向右子树递归进行后序遍历查找if(this.right!=null){resNode=this.right.postOrderSearch(no);}if(resNode!=null){return resNode;}System.out.println("进入后序查找");//如果左右子树都没有找到,就比较当前结点是不是if(this.no == no){return this;}return resNode;}public void delNode(int no){//二叉树删除结点//规则如下://1.如果删除的节点是叶子节点,则删除该节点//2.如果删除的节点是非叶子节点,则删除该子树(在二叉排序树中就不再这么简单了)if(this.left!=null && this.left.no==no){//2. 如果当前结点的左子结点不为空,并且左子结点 就是要删除结点,就将 this.left = null; 并且就返回(结 束递归删除)this.left=null;return;}if(this.right!=null && this.right.no==no){//3.如果当前结点的右子结点不为空,并且右子结点 就是要删除结点,就将 this.right= null ;并且就返回(结 束递归删除)this.right=null;return;}//4.我们就需要向左子树进行递归删除if(this.left!=null){this.left.delNode(no);}//5.则应当向右子树进行递归删除if(this.right!=null){this.right.delNode(no);}}}

测试结果:

"C:\Program Files\Java\jdk1.8.0_181\bin\java.exe" "-javaagent:D:\IntelliJ IDEA\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=51460:D:\IntelliJ IDEA\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_181\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\rt.jar;C:\Users\1\IdeaProjects\algorithm\out\production\algorithm" cn.zzw.algorithm.Tree.BinaryTreeDemo
删除前,前序遍历
HeroNode{no=1, name='宋江'}
HeroNode{no=2, name='吴用'}
HeroNode{no=3, name='卢俊义'}
HeroNode{no=5, name='关胜'}
HeroNode{no=4, name='林冲'}
删除结点后进行前序遍历
HeroNode{no=1, name='宋江'}
HeroNode{no=2, name='吴用'}
HeroNode{no=3, name='卢俊义'}
HeroNode{no=4, name='林冲'}Process finished with exit code 0

二十七、二叉树--删除结点相关推荐

  1. HNSW算法原理(二)之删除结点

    原文:https://blog.csdn.net/CHIERYU/article/details/86647014 HNSW算法原理(二)之删除结点 本篇文章继之前的一篇文章 HNSW算法原理(一)  ...

  2. 2021-10-11 二叉树 删除结点 (用到parent指针)

    太恶心了,三种情况理解就好 //! 删除结点 void BinarySearchTreesZH::remove(Node *node) {if (node->left != nullptr &a ...

  3. 将森林转换为对应的二叉树,若在二叉树中,结点u时结点v的父结点的父结点,则在原来的森林中,u和v可能具有的关系是( )

    将森林转换为对应的二叉树,若在二叉树中,结点u时结点v的父结点的父结点,则在原来的森林中,u和v可能具有的关系是( ① ② ) ① 父子关系 ② 兄弟关系 ③ u的父结点与v的父结点是兄弟关系 森林与 ...

  4. 数据结构专题二:2.6链表删除结点

    ///删除,删除指定位置的值,或者删除给定的值 //情形一:删除指定结点的后继结点 //情形二:删除第i个结点,假定头结点的i=0 //删除返回这个目标结点的地址,并不涉及到动态空间的回收 //在动态 ...

  5. JavaScript学习(二十七)—解决IE以及IE8之前的浏览器下面的添加事件或者删除事件

    JavaScript学习(二十七)-解决IE以及IE8之前的浏览器下面的添加事件或者删除事件 addEventListener和removeEventListener在IE8以及IE浏览器下面不支持, ...

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

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

  7. 红黑树----红黑树插入和删除结点的全程演示

    引言: 目前国内图书市场上,抑或网上讲解红黑树的资料层次不齐,混乱不清,没有一个完整而统一的阐述.而本人的红黑树系列四篇文章(详见文末的参考文献),虽然从头至尾,讲的有根有据,层次清晰,然距离读者真正 ...

  8. 求二叉树上结点的路径_剑指offer 二叉树

    二叉树的镜像(简单) 操作给定的二叉树,将其变换为源二叉树的镜像. 思路: 根节点左右节点调换位置 递归 注意判断空子树情况 二叉树的深度(简单) 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经 ...

  9. C语言基本数据结构之二(二叉树的三种遍历,节点数以及深度算法)

    关于二叉树的定义,网上有比较好的介绍,在这里就简单介绍二叉树的一些性质 二叉树的基本性质 1)二叉树的第i层上至多有 2^(i-1)(i ≥1)个结点: 2)深度为 h 的二叉树中至多含有 2^h – ...

最新文章

  1. 天猫精灵可以当电脑音响吗_天猫精灵推出便携式投影仪,小到可以装进口袋,试试效果...
  2. Java第一个程序(CMD环境)
  3. matlab imwrite函数保存jpg格式图像丢失数据或改变图像
  4. 中国机器人减速机行业十四五发展规划及未来需求预测报告2021-2027年
  5. python怎么将png转为tif_png转tif
  6. Quartz框架基于Calendar的排除规则
  7. c++11 std::bind与std::function
  8. oracle添加序列器,Oracle 建表,添加主外键,序列,触发器
  9. layui弹出框php,layui中使用的一些弹出框
  10. Oracle视图分类及各种操作讲解(超级好文)
  11. Shell:export命令
  12. “渠道之王”2.0   百丽携手乐淘的背后
  13. 2015/6/9 站立会议以及索引卡更新
  14. 关于GPS坐标系和地图定位偏差
  15. 服务器部署Nodejs api 接口
  16. ORACLE临时表空间总结
  17. Android 之大话-设计模式
  18. mysql容灾备份和恢复_关于容灾备份和恢复
  19. 初识Tesseract
  20. 【贪心】AcWing 803. 区间选点

热门文章

  1. java安装好了打不开机_劝告大家!早餐打豆浆,黄豆泡好直接打不对,教你1招,豆浆香浓更丝滑...
  2. 机器学习入门书籍、课程推荐
  3. 使用Selenium爬虫进阶
  4. html靶心制作,用PS单色填充制作一个靶心
  5. list对象_list对象,容量自适应的数组式容器
  6. The Innovation | Volume 3 Issue 1 正式出版
  7. 人类吃屎用屎指南:用做肥料不如制咖啡、当展品、做炸弹
  8. php修改数据库字段内容,php对数据库的增删改查操作
  9. python使用matplotlib可视化、为可视化图像添加标题(title)、自定义标题的字体格式、字体大小、字体颜色等
  10. R语言使用yardstick包的lift_curve函数评估多分类(Multiclass)模型的性能、并使用autoplot函数可视化模型在每个交叉验证(或者重采样)的每一折fold在每个分类上的提升