2013-03-09 20 views
14

Diciamo che ho una semplice classe nodo di albero binario, in questo modo:Attraversando attraverso tutti i nodi di un albero binario 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; 
    } 
} 

Come vorrei aggiungere un metodo che è in grado di attraversare ricorsivamente attraverso qualsiasi albero di dimensioni , visitando ogni nodo esistente da sinistra a destra, senza rivisitando un nodo che è già stato attraversato?

Sarebbe questo lavoro ?:

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

sembra molto simile alla risposta corretta di seguito. –

+0

@PeterWooster - a destra, tranne che sto chiamando il metodo traversa da ciascun nodo, causando la ricorsività in modo ricorsivo per ciascun nodo anziché solo dalla radice – RectangleEquals

risposta

28

Ci sono 3 tipi di albero binario di attraversamento che si possono ottenere:

esempio:

prendere in considerazione questa seguente albero binario:

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) 

codice di esempio:

sinistra a destra attraversamento del albero binario, anzi Per Traversal di albero binario:

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, La ricorsione è sempre la risposta per gli alberi. La risposta interessante è fare questo senza ricorsione. –

+3

@Peter Wooster La soluzione iterativa è un po 'più difficile da capire soprattutto per i principianti, quindi ho pensato perché fare complicazioni. – codeMan

+2

Sono d'accordo, ho scritto qualcosa del genere in assembler anni fa, usava una pila ovviamente. –

7

codeMan è giusto. L'attraversamento visiterà ogni nodo a sinistra. Una volta che raggiunge l'ultimo nodo a sinistra, inizia a risalire lungo i nodi di destra. Questa è una traversata di ricerca in profondità (DFS). In quanto tale, ogni nodo viene visitato solo una volta e l'algoritmo viene eseguito in tempo O (n). Buona programmazione.

Problemi correlati