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 - право, за исключением того, что я вызываю метод траверса с каждого узла, заставляя рекурсию проходить рекурсивно для каждого узла, а не только от корня – RectangleEquals

ответ

28

Есть 3 типа Binary обхода дерева, которые можно достичь:

пример:

считают это следующее бинарное дерево:

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). Таким образом, каждый узел посещается только один раз, и алгоритм работает в O (n) времени. Счастливое кодирование.