Threading droite un arbre binaire

voix
0

Je vais avoir un enfer d'un temps à essayer de comprendre cela. Partout où je regarde, il me semble être que courir dans des explications sur la façon de traverser en fait la liste non-récursive (la partie que je comprends réellement). Quelqu'un peut-il là-bas marteau dans exactement comment je peux passer par la liste au départ et trouver le prédécesseur réel / successeur noeuds afin que je puisse les marquer dans la classe de noeud? Je dois être en mesure de créer un simple binaire arbre de recherche et de passer par la liste et réacheminer les liens nuls au prédécesseur / successeur. J'ai eu un peu de chance avec une solution un peu comme ce qui suit:

thread(node n, node p) {
     if (n.left !=null)
        thread (n.left, n);
     if (n.right !=null) {
        thread (n.right, p);
     }
     n.right = p;
}
Créé 29/07/2009 à 19:11
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
1

D'après votre description, je suppose que vous avez un nœud avec une structure ressemblant à quelque chose comme:

Node {
  left
  right
}

... et que vous avez un arbre binaire de ces mis en place à l'aide de la gauche et à droite, et que vous voulez réattribuer les valeurs à gauche et à droite telle qu'elle crée une liste doublely liée à une profondeur de la première traversal arbre.

La racine (sans jeu de mots) problème avec ce que vous avez à ce jour est que le « nœud p » (abréviation de précédent?) Qui est passé au cours de la traversée doit être indépendante de l' endroit où dans l'arbre que vous êtes actuellement - il toujours doit contenir le noeud visité précédemment. Pour ce faire, chaque fil de temps est exécuté , il doit faire référence à la même variable « précédente ». Je l' ai fait un code de pseudo Python-ish avec un C-isme - si vous n'êtes pas familier, « et » signifie « référence à » (ou « ref » en C #), et « * » signifie « déréférencement et donnez - moi l'objet qu'il pointe vers ».

Node lastVisited
thread(root, &lastVisisted)

function thread(node, lastVisitedRef)
  if (node.left)
    thread(node.left, lastVisitedRef)
  if (node.right)
    thread(node.right, lastVisitedRef)

  // visit this node, reassigning left and right
  if (*lastVisitedRef)
    node.right = *lastVisitedRef
    (*lastVisitedRef).left = node
  // update reference lastVisited
  lastVisitedRef = &node

Si vous allez implémenter dans C, vous auriez réellement besoin d'un double pointeur pour maintenir la référence, mais l'idée est la même - vous devez conserver l'emplacement du « dernier nœud visité » pendant toute la durée traversal.

Créé 31/07/2009 à 05:36
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more