二叉树查找和删除指定结点(二叉树 删除)

  本篇文章为你整理了二叉树查找和删除指定结点(二叉树 删除)的详细内容,包含有查找二叉树删除节点 二叉树 删除 二叉查找树删除根节点 二叉查找树的删除 二叉树查找和删除指定结点,希望能帮助你了解 二叉树查找和删除指定结点。

  2.如果是相等,则返回当前节点

  3.如果不等,则判断当前节点的左子节点是否为空,如果不为空,则递归前序查找

  4.如果左递归前序查找,找到节点,则返回,否继续判断,当前的节点的右子节点是否为空,如果不为空,则继续向右递归前序查找。

  中序查找思路

  1.判断当前节点的左子节点是否为空,如果不为空,则递归中序查找

  2.如果找到,则返回,如果没有找到,就和当前节点比较,如果是则返回当前节点,否则继续进行右递归的中序查找

  3.如果右递归中序查找,找到就返回,否则返回null

  后序查找思路

  1.判断当前节点的左子节点是否为空,如果不为空,则递归后序查找

  2.如果找到,就返回,如果没有找到,就判断当前节点的右子节点是否为空,如果不为空,则右递归进行后序查找,如果找到,就返回

  3.就和当前节点进行比较,如果是则返回,否则返回null

  要求

  1.请编写前序查找,中序查找和后序查找的方法。

  2.并分别使用三种查找方式,查找 heroNO = 5 的节点

  3.并分析各种查找方式,分别比较了多少次

  代码实现:

  先创建HeroNode 结点

  

class HeroNode {

 

   private int no;

   private String name;

   private HeroNode left; //默认null

   private HeroNode right; //默认null

   public 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;

   @Override

   public 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();

   //前序遍历查找

   * @param no 查找no

   * @return 如果找到就返回该Node ,如果没有找到返回 null

   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;

  

 

  定义BinaryTree 二叉树

  

class BinaryTree {

 

   private HeroNode root;

   public void setRoot(HeroNode root) {

   this.root = root;

   //前序遍历查找

   public HeroNode preOrderSearch(int no) {

   if(root != null) {

   return root.preOrderSearch(no);

   } else {

   return null;

   //中序遍历查找

   public HeroNode infixOrderSearch(int no) {

   if(root != null) {

   return root.infixOrderSearch(no);

   }else {

   return null;

   //后序遍历查找

   public HeroNode postOrderSearch(int no) {

   if(root != null) {

   return this.root.postOrderSearch(no);

   }else {

   return null;

  

 

  测试:

  

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);

   // 前序遍历

   // 前序遍历的次数 :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);

   // 中序遍历查找

   // 中序遍历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);

   // 后序遍历查找

   // 后序遍历查找的次数 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);

  

 

  运行结果如图:

  前序遍历:

  中序遍历:

  后序遍历:

  二叉树删除指定的节点

  要求

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

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

  3.测试,删除掉 5 号叶子节点

  
1.考虑如果树是空树root,如果只有一个root节点,则等价将二叉树置空

  2.因为我们的二叉树是单向的,所以我们是判断当前节点的子节点是否是需要删除节点,而不能去判断当前这个节点是不是需要删除节点。

  3.如果当前节点的左子节点不为空,并且左子节点就是要删除节点,就将this.left=null;

  并且就返回(结束递归删除)

  4.如果当前节点的右子节点不为空,并且右子节点就是要删除节点,就将this.right=null;

  并且就返回(结束递归删除)

  5.如果3,4步没有删除节点,那么我们就需要向左子树进行递归删除

  6.如果第5步也没有删除节点,则应当向右子树进行递归删除。

  代码实现:

  //HeroNode 类增加方法

  

//递归删除结点

 

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

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

   public void delNode(int no) {

   //思路

   * 1. 因为我们的二叉树是单向的,所以我们是判断当前结点的子结点是否需要删除结点,而不能去判断当前这个结点是不是需要删除结点.

   2. 如果当前结点的左子结点不为空,并且左子结点 就是要删除结点,就将this.left = null; 并且就返回(结束递归删除)

   3. 如果当前结点的右子结点不为空,并且右子结点 就是要删除结点,就将this.right= null ;并且就返回(结束递归删除)

   4. 如果第2和第3步没有删除结点,那么我们就需要向左子树进行递归删除

   5. 如果第4步也没有删除结点,则应当向右子树进行递归删除.

   //2. 如果当前结点的左子结点不为空,并且左子结点 就是要删除结点,就将this.left = null; 并且就返回(结束递归删除)

   if(this.left != null this.left.no == no) {

   this.left = null;

   return;

   //3.如果当前结点的右子结点不为空,并且右子结点 就是要删除结点,就将this.right= null ;并且就返回(结束递归删除)

   if(this.right != null this.right.no == no) {

   this.right = null;

   return;

   //4.我们就需要向左子树进行递归删除

   if(this.left != null) {

   this.left.delNode(no);

   //5.则应当向右子树进行递归删除

   if(this.right != null) {

   this.right.delNode(no);

  

 

  //在 BinaryTree 类增加方法

  

//删除结点

 

   public void delNode(int no) {

   if(root != null) {

   //如果只有一个root结点, 这里立即判断root是不是就是要删除结点

   if(root.getNo() == no) {

   root = null;

   } else {

   //递归删除

   root.delNode(no);

   }else{

   System.out.println("空树,不能删除~");

  

 

  //在 BinaryTreeDemo 类增加测试代码:

  

//测试一把删除结点

 

   System.out.println("删除前,前序遍历");

   binaryTree.preOrder(); // 1,2,3,5,4

   binaryTree.delNode(5);

   //binaryTree.delNode(3);

   System.out.println("删除后,前序遍历");

   binaryTree.preOrder(); // 1,2,3,4

  

 

  代码运行如图:

  这篇博客是我在B站看韩顺平老师数据结构和算法的课时的笔记,记录一下,防止忘记,也希望能帮助各位朋友。

  以上就是二叉树查找和删除指定结点(二叉树 删除)的详细内容,想要了解更多 二叉树查找和删除指定结点的内容,请持续关注盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: