2013-03-09 1 views
14
にバイナリツリーのすべてのノードを横断

のは、私はそうのように、単純なバイナリツリーノードのクラスを持っているとしましょう:Javaの

public class BinaryTreeNode { 
    public String identifier = ""; 
    public BinaryTreeNode parent = null; 
    public BinaryTreeNode left = null; 
    public BinaryTreeNode right = null; 

    public BinaryTreeNode(BinaryTreeNode parent, String identifier) 
    { 
     this.parent = parent; //passing null makes this the root node 
     this.identifier = identifier; 
    } 

    public boolean IsRoot() { 
     return parent == null; 
    } 
} 

にはどうすれば再帰的に任意のサイズの木を横断することが可能である方法を追加します既存の各ノードを左から右に移動して、なしで、すでに通過したノードを再訪しますか?

この作品?:

public void traverseFrom(BinaryTreeNode rootNode) 
{ 
    /* insert code dealing with this node here */ 

    if(rootNode.left != null) 
     rootNode.left.traverseFrom(rootNode.left); 

    if(rootNode.right != null) 
     rootNode.traverseFrom(rootNode.right); 
} 
+0

これは以下の正解とよく似ています。 –

+0

@PeterWooster - 右、各ノードからtraverseメソッドを呼び出して、ルートからではなく各ノードに対して再帰的に発生させることを除いて – RectangleEquals

答えて

28

はあなたが達成することができバイナリツリートラバーサルの3種類があります:

enter image description here

:この次のバイナリツリーを検討

の例では、

Pre-order traversal sequence: F, B, A, D, C, E, G, I, H (root, left, right) 
In-order traversal sequence: A, B, C, D, E, F, G, H ,I (left, root, right) 
Post-order traversal sequence: A, C, E, D, B, H, I, G, F (left, right, root) 

コード例:

、二分木の右トラバーサルバイナリツリーの順走査でいやを左:

public void traverse (Node root){ // Each child of a tree is a root of its subtree. 
    if (root.left != null){ 
     traverse (root.left); 
    } 
    System.out.println(root.data); 
    if (root.right != null){ 
     traverse (root.right); 
    } 
} 
+8

+1、再帰は常にツリーの答えです。興味深い答えは、再帰なしでこれを行うことです。 –

+3

@Peter Wooster反復的な解法は、特に初心者のために理解するのが少し難しいので、なぜ合併症を起こすのかと考えました。 – codeMan

+2

私は同意します。何年も前にアセンブラで書いたように、スタックを使用しました。 –

7

codeManは正しいです。トラバーサルは、左側のすべてのノードを訪問します。一番左のノードに達すると、右側のノードに沿って作業を開始します。これは深さ優先検索(DFS)トラバーサルです。そのため、各ノードは1回のみ訪問され、アルゴリズムはO(n)時間で実行されます。ハッピーコーディング。