2012-03-15 9 views
1

ANTLRツリーコマンドと再帰を使ってツリーを走査しようとしています。私が現在持っているコードは:深い最初の問題で再帰的にツリーをたどる

public void traverseTree(Tree tree){ 
     int counter = 0; 
     System.out.println(tree.toString()); 
     if (tree.getChildCount() > 0 && tree.getChild(0) != null){ 
      System.out.println(tree.toString() + counter++); 
      tree = tree.getChild(0); 
      traverseTree(tree); 

     } 
     while (tree.getParent().getChild(tree.getChildIndex() + 1) != null){ 
      System.out.println(tree.toString() + counter++); 
      tree = tree.getParent().getChild(tree.getChildIndex() + 1); 
      traverseTree(tree); 

     } 
    } 

ですが、うまくいきません。私は木の中にたくさんのエントリーを入れていますが、明らかな順序はありません。誰かが私が間違っているのを見ることができますか?

ありがとうございました。

編集:私はその下に作られた

コメントで始めるためにここにされている必要があります:

申し訳ありませんが、私はprint文を削除している必要があり、彼らはそれを試してみて、デバッグするだけでした。私が遭遇している問題は、それが始まるノードとそのノードの兄弟を検索するだけで、レベルを上げるべきではないが、すべてを印刷するということです。 (私はこれをメインに編集します、それは最初からあったはずです、残念です)。

public void traverseTree(Tree tree){ 
     System.out.println(tree); 
     if (tree.getChild(0) != null){ 
      traverseTree(tree.getChild(0)); 
     } 
     if(tree.getParent().getChildCount() > 1){ 
      if(tree.getParent().getChild(tree.getChildIndex() + 1) != null) 
      traverseTree(tree.getParent().getChild(tree.getChildIndex() + 1)); 
     } 
    } 
+0

"深みのあるもの" ...レベル順を意味しますか?レベルの逆順ですか?私は混乱しています。他の可能性はpreorder、inorder、postorder – varatis

答えて

2

レベルを上げることがないようにする最も簡単な方法は、決してgetParent()に電話しないようにすることです。上層階がないと分からなければ、そこに行くことはできません。

public void traverseTree(Tree tree) { 

    // print, increment counter, whatever 
    System.out.println(tree.toString()); 

    // traverse children 
    int childCount = tree.getChildCount(); 
    if (childCount == 0) { 
     // leaf node, we're done 
    } else { 
     for (int i = 0; i < childCount; i++) { 
      Tree child = tree.getChild(i); 
      traverseTree(child); 
     } 
    } 
} 

すべての再帰のポイントは、バックアップする必要がないということです。このレベルのtraverseTree()が終了すると、前のレベルのループは次の兄弟に続きます。

(リーフノードに到達したときに特別なことをしない限り、は実際には必要ではありません)コメントを入力すると、何が起こっているのかがわかります。再帰をやめる方法を理解することから始める再帰の良いアイデア)

+0

しかし、それは事です、私はgetParentをやっているとき以外はgetParent()を使用しません。getChild(getChildIndex()+ 1)は次の兄弟に移動するだけです(これを行う別の方法はないようです)。 – djcmm476

+0

次の兄弟に移動する必要はありません。親のレベルのループがそれを処理します。 –

+0

(もちろん、実際にはループが必要ですが、ループなしで実行することは可能ですが、なぜそうしたいのかはわかりません) –

0

はこれを試してください:あなたは何回か同じノードをプリントアウトしているよう

int counter = 0; 
public void traverseTree(Tree tree) { 

    for (int i=0; i<tree.getChildCount(); i++) { 
     Tree child = tree.getChild(i); 
     System.out.println(tree.toString() + counter++); 
     traverseTree(tree); 
    } 
} 
2

に見えます

私は、コードはそうのような最終的に働いて得ることができました。あなたはわずか4 5 6 2 3 1に切り替えるには

1 
2 3 
4 5 6 

Depth first - 1 2 4 5 3 6 
Breadth first - 1 2 3 4 5 6 

//For depth first 
public void traverseTree(Tree tree){   
    System.out.println(tree.toString()); 
    for (int x = 0; x < tree.getChildCount(); x++) 
     traverseTree(tree.getChild(x)); 
} 

、あなたがダウンして行くようにノードを印刷したい場合は、単にのためのループの後にprintlnを移動します。

+0

です。申し訳ありませんが、私は印刷文を削除する必要がありました。私が遭遇している問題は、それが始まるノードとそのノードの兄弟を検索するだけで、レベルを上げるべきではないが、すべてを印刷するということです。 (私はこれをメインに編集します、それは最初からあったはずです、残念です)。 – djcmm476

+0

@Incredidave Thomasのソリューション(ほぼ)は、あなたがそれを与えるどのノードでも動作します(null終了ステートメントが必要です)。子供から始める場合は、ルートの代わりにそれを渡してください。実際には、どのように各ノードにアクセスしようとしているか、そこで何をするつもりで、どのような順序で訪問するかについて、より具体的にする必要があります。 – varatis

+0

私は子がnullでないと仮定していたので、getChildCount()が0であるため終了します。いずれの場合も、実際の質問には答えません。 – Thomas

関連する問題