2016-12-30 10 views
0

タスクは通常、再帰的なポストオーダートラバーサルの間に行われ、オンラインの例はほとんどありません。そのうちの1つは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に割り当てると、技術的にすべてのデータが取り除かれます。リンクされたリストと同様に、接続ごとに「next」をヌルに設定してリストを削除すると、Javaガベージコレクタが残りの部分を処理します。そのため、あなたがリンクしているJavaコードでは、ルートが子を持たないと決定されると、同じことをしています。

関連する問題