2013-03-09 10 views
14

Lassen Sie sich sagen, dass ich eine einfache binäre Baum Knotenklasse habe, etwa so:Verfahrgeschwindigkeit durch alle Knoten eines binären Baumes in 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; 
    } 
} 

Wie würde ich eine Methode hinzufügen, die in der Lage ist rekursiv durch jede Größe Baum durchquert , jeden vorhandenen Knoten von links nach rechts zu besuchen, ohne einen bereits durchlaufenen Knoten erneut zu besuchen?

Würde diese Arbeit ?:

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

das sieht sehr ähnlich wie die richtige Antwort unten. –

+0

@PeterWooster - rechts, außer dass ich die Traverse-Methode von jedem Knoten aus aufrufen, wodurch die Rekursion für jeden Knoten rekursiv statt nur von der Wurzel – RectangleEquals

Antwort

28

Es gibt 3 Arten von Binary Tree Traversal, die Sie erreichen können:

Beispiel:

betrachten dies folgende Binärbaum:

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) 

Codebeispiel:

nach rechts Durchlauf des binären Baum links, ja Um Traversal von binären Baum:

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 auftritt, ist Rekursion immer die Antwort für Bäume. Die interessante Antwort ist, dies ohne Rekursion zu tun. –

+3

@Peter Wooster Iterative Lösung ist etwas schwieriger für Anfänger zu verstehen, also dachte ich, warum Komplikationen machen. – codeMan

+2

Ich stimme zu, ich habe so etwas in Assembler Jahren geschrieben, es hat natürlich einen Stapel verwendet. –

7

Codeman ist richtig. Das Traversal wird jeden Knoten auf der linken Seite besuchen. Sobald es den letzten Knoten auf der linken Seite erreicht, beginnt es sich entlang der rechten Knoten zurück zu arbeiten. Dies ist eine Tiefensuche (DFS). Daher wird jeder Knoten nur einmal besucht, und der Algorithmus läuft in O (n) -Zeit. Glückliche Kodierung.

Verwandte Themen