2016-12-30 28 views
0

该任务通常在递归后序遍历期间完成,并且有几个在线示例。其中之一是here,但我不知道它是否正确,因为_deleteTree()方法似乎只能执行BFS,并且不会对节点执行任何操作,并且只需将树的根设置为null即可完成删除操作。它无疑会返回一棵空树。但是,删除对所有树节点的引用是否正确?在java中反复破坏二叉树

此外,对于迭代后序遍历,比如说,像下面

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)吗?谢谢!

+0

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

回答

0

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

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

通常,当您将节点分配给空值时,您在技术上将删除所有数据。与链接列表一样,当您通过将其“连接”设置为null来断开其连接时,您将删除该列表,并使用Java垃圾回收器来处理其余的部分。因此,在您关联的Java代码中,一旦根确定没有孩子,他们就会做同样的事情。