美文网首页
二叉树递归删除结点的两种写法

二叉树递归删除结点的两种写法

作者: 何几时 | 来源:发表于2021-01-14 19:46 被阅读0次

一、无返回值版本--尚硅谷韩老师version

结点类

class Node {
  public void delNode(int no){
        // 2. 如果当前节点的左节点不为空,并且左节点就是删除节点,就将this.left = null; 并且就返回(结束递归删除)
        if (this.left != null && this.left.no == no){
            this.left = null;
            return;
        }
        // 3. 如果当前节点的右节点不为空,并且左节点就是删除节点,就将this.left = null; 并且就返回(结束递归删除)
        if (this.right != null && this.right.no == no){
            this.right = null;
            return;
        }
        // 4. 我们需要向左子树递归
        if (this.left != null){
            cnt++;
            this.left.delNode(no);
        }
        // 5. 我们需要向右子树递归
        if (this.right != null){
            cnt++;
            this.right.delNode(no);
        }

    }
}

连接类

class BinaryTree {
  // ...
  // 删除节点--韩老师代码
    public void delNode(int no){
        if (root != null){
            // 如果只有一个root节点,这里要立即判断root是不是就是要删除的节点
            if (root.getNo() == no){
                root = null;
            } else {
                root.delNode(no);
                System.out.println("遍历的节点数:"+root.getCnt());
            }
        } else{
            //
            System.out.println("空树,不能删除!");;
        }
    }
}

二、有返回值版本--DIY版本

其实删除操作就是在查找操作之上再做文章,还是脑海中要有三序遍历的框架

三序遍历框架:

public void threeOrderTraverse(){
   System.out.println("前序遍历");
   if (this.left != null) {
     this.left.threeOrderTraverse();
   }
   System.out.println("中序遍历");
   if (this.right != null) {
     this.right.threeOrderTraverse();
   }
   System.out.println("后序遍历");
}

三序查找框架(三序遍历框架2.0)

具体的查找代码为

if ( this.no == no ) {
   return this;
}

整体代码为

public Node threeOrderSearch(int no){
   /*
   // 前序查找
  */
   Node resNode = null;  // 返回变量
   if (this.left != null) {
     resNode = this.left.threeOrderSearch(no);
   }
   // 拦截代码
   if (resNode != null) {
      return resNode;
   }
   /*
   // 中序查找
   */
   if (this.right != null) {
     resNode = this.right.threeOrderSearch(no);
   }
   /*
   // 后序查找
   */
}

以下就是具体的删除代码,返回类型从查找的返回Node类型改为返回boolean类型


结点类

class Node {
  // ...
  public boolean preOrderDelete(int no){
        if (this.left != null && this.left.no == no){
            this.left = null;
            return true;
        } else if (this.right != null && this.right.no == no){
            this.right = null;
            return true;
        }

        boolean isFind = false;
        if (this.left != null) {
            isFind = this.left.preOrderDelete(no);
        }
        if (isFind){ //
            return true;
        }

        // 否则进行右子结点的递归
        if (this.right != null){
            isFind = this.right.preOrderDelete(no);
        }

        return isFind;
    }
}

连接类:

class preorderDelete(int no){
  // 删除节点--DIY
    public void preorderDelete(int no){
        if (root != null){
            // 如果只有一个root节点,这里要立即判断root是不是就是要删除的节点
            if (root.getNo() == no){
                root = null;
            } else {
                boolean isFind;
                isFind = root.preOrderDelete(no);
                if (isFind){
                    System.out.println("已删除节点!");
                    System.out.println("遍历的节点数:"+root.getCnt());
                } else {
                    System.out.println("查无此节点!");
                }
            }
        } else{
            //
            System.out.println("空树,不能删除!");;
        }
    }
}

三、比较两种删除写法的效率

相比之下,有返回值的写法效率会很多,因为它具有拦截功能,在找到要删除的结点后不会再往下右搜索,而不带返回值的写法会继续往右搜索。

相关文章

  • 二叉树递归删除结点的两种写法

    一、无返回值版本--尚硅谷韩老师version 结点类 连接类 二、有返回值版本--DIY版本 其实删除操作就是在...

  • 二叉树的各种操作(递归和非递归遍历,树深度,结点个数等等)

    二叉树建立 先给出结点结构: 两种建立方式: 可以根据二叉树根节点和左右子结点的下标关系递归建立二叉树,层次输入二...

  • 二叉树 遍历 前序,中序,后序。是以遍历根结点的顺序来定义的写法:递归是很自然的写法,也可借助栈用循环来实现 与 ...

  • 2020-09-23

    二叉树前序遍历几种写法 递归 非递归

  • 数据结构题目50:二叉树的删除

    题目:删除二叉树的结点。这里所说的二叉树的删除是指 删除并释放该二叉树中数据域内容为item的那个结点和以该结点为...

  • 94. Binary Tree Inorder Traversa

    二叉树的中序遍历,可以是经典的递归写法。能写成递归就可以写成迭代,但是迭代的话需要保存一下之前的结点。比如对roo...

  • 64_二叉树的结点删除与清除

    关键词:二叉树的结点的删除、二叉树的结点的清除 0. 删除的方式 基于数据元素值的删除:SharedPointer...

  • 二叉树遍历-JAVA实现

    基础二叉树 二叉树遍历分为前序、中序、后序递归和非递归遍历、还有层序遍历。 前序递归遍历算法:访问根结点-->递归...

  • 数据结构题目38:求二叉树的深度

    题目:已知二叉树采用二叉链表存储结构,根结点所在链结点的地址为T,写一递归算法,求该二叉树的深度。 (一)递归算法...

  • 二叉树 | 定义、性质、操作

    内容参考自胡凡,曾磊 《算法笔记》 二叉树的递归定义 递归边界:二叉树没有根结点,是一棵空树。 递归式:二叉树由根...

网友评论

      本文标题:二叉树递归删除结点的两种写法

      本文链接:https://www.haomeiwen.com/subject/avsfwktx.html