2016-12-30 50 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代碼中,一旦根確定沒有孩子,他們就會做同樣的事情。