Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中迭代销毁二叉树_Java_Algorithm_Binary Tree_Destroy - Fatal编程技术网

在java中迭代销毁二叉树

在java中迭代销毁二叉树,java,algorithm,binary-tree,destroy,Java,Algorithm,Binary Tree,Destroy,该任务通常在递归后序遍历期间完成,并且很少有在线示例。其中一个是,但我想知道它是否正确,因为_deleteTree()方法似乎只执行BFS操作,不对节点执行任何操作,而删除是通过简单地将树的根设置为null来完成的。毫无疑问,它将返回一棵空树。但是,删除对所有树节点的引用是否正确 同样,对于迭代的后序遍历,比如说,如下所示 public TreeNode postorderTraversal(TreeNode root) { if(root==null) return null;

该任务通常在递归后序遍历期间完成,并且很少有在线示例。其中一个是,但我想知道它是否正确,因为_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;
}
公共TreeNode postorderTraversal(TreeNode根目录){ if(root==null)返回null; Stack stack1=新堆栈(); Stack stack2=新堆栈(); TreeNode cur=根; 堆栈1.推送(cur); 而(!stack1.isEmpty()){ cur=stack1.pop(); 如果(cur!=null){ 堆栈2.推送(cur); } if(当前左侧!=null){ 堆栈1.推送(当前左侧); } if(当前右侧!=null){ 堆栈1.推送(当前右侧); } } 而(!stack2.isEmpty()){ //poped元素将按后顺序排列 } 返回根; }
如何迭代销毁二叉树?有人能给出一个示例代码(java)吗?谢谢

通常,当您将一个节点指定为null时,您会从技术上删除所有数据。与链表一样,当您通过将其“next”per say设置为null来断开其连接时,您将删除该列表,而java垃圾收集器将处理其余部分。因此,在您链接的Java代码中,一旦确定根目录没有子目录,它们就会执行相同的操作

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

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

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