18

次のような単純なバイナリ ツリー ノード クラスがあるとします。

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);
}
4

2 に答える 2

36

実行できるバイナリ ツリー トラバーサルには、次の 3 つのタイプがあります。

例:

次のバイナリ ツリーを検討してください。

ここに画像の説明を入力

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);
    }
}
于 2013-03-09T02:25:43.590 に答える
8

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

于 2013-03-09T02:29:19.393 に答える