web-dev-qa-db-ja.com

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

任意のサイズのツリーを再帰的にトラバースし、既存の各ノードを左から右に訪問できるメソッドを追加するにはどうすればよいですか?without

これは機能しますか?:

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);
}
15
RectangleEquals

達成できる2種類のバイナリツリートラバーサルがあります。

例:

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

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);
    }
}
33
codeMan

codeManは正しい。走査は左側のすべてのノードを訪問します。左側の最後のノードに到達すると、右側のノードに沿って戻り始めます。これは、深さ優先検索(DFS)トラバーサルです。そのため、各ノードは1回だけアクセスされ、アルゴリズムはO(n) time。Happy coding。で実行されます。

8
RouteMapper