2010-04-07 9 views

Répondre

4

Deuxième édition: I pense que c'est juste. Requiert node.isRoot, node.isLeftChild et node.parent, en plus des nœuds node.left_child et node.right_child habituels.

state = "from_parent" 
current_node = root 
while (!done) 
    switch (state) 
    case "from_parent": 
     if current_node.left_child.exists 
     current_node = current_node.left_child 
     state = "from_parent" 
     else 
     state = "return_from_left_child" 
    case "return_from_left_child" 
     if current_node.right_child.exists 
     current_node = current_node.right_child 
     state = "from_parent" 
     else 
     state = "return_from_right_child" 
    case "return_from_right_child" 
     if current_node.isRoot 
     done = true 
     else 
     if current_node.isLeftChild 
     state = "return_from_left_child" 
     else 
     state = "return_from_right_child" 
     current_node = current_node.parent 
+3

Je suis à peu près certain que cela va avoir des problèmes avec les arbres de profondeur> 2. –

+0

Vous me battez pour ça. Mais notez que cela ne fonctionne que si le champ node.parent existe, c'est-à-dire si le noeud connaît son parent. Ceci est autorisé, mais pas obligatoire, par la définition d'un arbre binaire. – Beta

+0

Si vous avez node.parent, vous n'avez pas besoin de node.isRoot. Aussi, je pense que vous pouvez faire sans node.isLeftChild. – Beta

0

Étant donné que traverser un binary tree nécessite un certain type d'état (les noeuds à retourner après la visite des successeurs) qui pourrait être fourni par la pile impliquée par la récursivité (ou explicite par un tableau).

La réponse est non, vous ne pouvez pas. (Selon la définition classique)

La chose la plus proche à un traversal arbre binaire de manière itérative utilise probablement une heap

EDIT: Ou comme cela a déjà montré une threaded binary tree,

+0

Un arbre fileté semble répondre aux exigences de Gogu. –

0

Oui, vous pouvez. Pour ce faire, vous auriez besoin d'un pointeur parent pour monter dans l'arbre.

-1

Comme quelqu'un l'a déjà dit, c'est possible, mais pas sans le pointeur parent. Le pointeur parent vous permet fondamentalement de parcourir "le chemin" si vous le souhaitez, et donc d'imprimer les nœuds. Mais pourquoi la récursivité fonctionne-t-elle sans pointeur parent? Eh bien, si vous comprenez récursivité il va quelque chose comme ça (imaginez la pile de récursion):

recursion //going into 
    recursion 
    recursion 
    recursion 
    recursion //going back up 
    recursion 
    recursion 
    recursion 

Alors, quand alors récursion se termine, vous avez imprimé le côté choisi de l'arbre binaire dans l'ordre inverse.

0

Commencez par tree_first(), continuez avec tree_next() jusqu'à obtenir NULL. code complet: https://github.com/virtan/tree_closest

struct node { 
    int value; 
    node *left; 
    node *right; 
    node *parent; 
}; 

node *tree_first(node *root) { 
    while(root && root->left) 
     root = root->left; 
    return root; 
} 

node *tree_next(node *p) { 
    if(p->right) 
     return tree_first(p->right); 
    while(p->parent) { 
     if(!p->parent->right || p->parent->right != p) 
      return p->parent; 
     else p = p->parent; 
    } 
    return 0; 
}