Обход всех узлов двоичного дерева в 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);
}

2 ответов


существует 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);
    }
}

codeMan прав. Обход посетит каждый узел слева. Как только он достигает последнего узла слева, он начинает работать обратно вдоль правых узлов. Это обход поиска глубины (DFS). Таким образом, каждый узел посещается только один раз, и алгоритм работает за o(n) времени. Удачи в кодировании.