【问题标题】:destroying a binary tree iteratively in java [duplicate]在java中迭代地破坏二叉树[重复]
【发布时间】:2016-12-30 15:23:07
【问题描述】:

该任务一般在递归后序遍历时完成,网上的例子很少。其中之一是here,但我想知道它是否正确,因为_deleteTree() 方法似乎只做BFS,对节点没有任何操作,而删除只需将树的根设置为null。毫无疑问,它会返回一棵空树。但是删除对所有树节点的引用是正确的方法吗?

另外,对于迭代后序遍历,例如,如下所示

public TreeNode postorderTraversal(TreeNode root) {
    if(root==null) return null;
    Stack<TreeNode> stack1=new Stack<>();
    Stack<TreeNode> stack2=new Stack<>();
    TreeNode cur=root;
    stack1.push(cur);
    while(!stack1.isEmpty()){
        cur=stack1.pop();

        if(cur!=null){
            stack2.push(cur);
        }

        if(cur.left!=null){
            stack1.push(cur.left);
        }
        if(cur.right!=null){
            stack1.push(cur.right);
        }
    }

    while(!stack2.isEmpty()){
        //elements poped will be in post order sequence
        }
    return root;
}

如何迭代地销毁二叉树?有人可以提供示例代码(java)吗?谢谢!

【问题讨论】:

  • 您链接到的代码具有误导性。看起来有人拿了 C++ 的例子,并试图用 Java “逐字”重写它。 deleteTree 概念根本不适用于 Java。正如您所指出的,该方法的 Java 版本实际上并没有做任何事情。

标签: java algorithm binary-tree destroy


【解决方案1】:

有一个更好的解决方案,它使用树节点本身来存储队列。像这样的:

static void clear(Node root) {
    while (root != null) {
        Node left = root.left;
        if (left == null) {
            Node right = root.right;
            root.right = null;
            root = right;
        } else {
            // Rotate the left child up.
            root.left = left.right;
            left.right = root;
            root = left;
        }
    }
}

【讨论】:

    【解决方案2】:

    通常,当您将节点分配为 null 时,从技术上讲,您会删除所有数据。与链接列表一样,当您通过将其“下一个”设置为 null 来断开其连接时,您将删除该列表,而 Java 垃圾收集器将负责其余的工作。因此,在您链接的 Java 代码中,一旦确定根没有孩子,他们就会做同样的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-20
      • 1970-01-01
      • 1970-01-01
      • 2011-02-25
      • 2019-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多