Rechts Threading een Binary Tree

stemmen
0

Ik heb een hel van een tijd proberen om dit uit te zoeken. Overal waar ik kijk, ik schijn alleen worden uitgevoerd in de uitleg over hoe je nu eigenlijk dwars door de lijst met niet-recursief (het deel ik eigenlijk begrijpen). Kan iemand daar hamer in hoe precies ik kan gaan door de lijst in eerste instantie en vind de werkelijke voorganger / opvolger knooppunten dus ik kan vlag ze in de knoop klas? Ik moet in staat zijn om een ​​eenvoudige binaire zoekboom te maken en ga door de lijst en omleiden de nul links naar de voorganger / opvolger. Ik heb wat geluk met een oplossing enigszins als het volgende gehad:

thread(node n, node p) {
     if (n.left !=null)
        thread (n.left, n);
     if (n.right !=null) {
        thread (n.right, p);
     }
     n.right = p;
}
De vraag is gesteld op 29/07/2009 om 19:11
bron van user
In andere talen...                            


1 antwoorden

stemmen
1

Vanuit uw beschrijving, ik neem aan dat je een knooppunt met een structuur op zoek naar iets als:

Node {
  left
  right
}

... en dat u een binaire boom van deze ingesteld met behulp van de linker en rechter, en dat je opnieuw wilt toewijzen waarden naar links en naar rechts, zodat het creëert een doublely-linked-list van een diepte eerste traversal van de boom.

De wortel (no pun intended) probleem met wat je tot nu toe hebt, is dat de "knooppunt p" (kort voor de vorige?), Die tijdens de traversal wordt doorgegeven moet onafhankelijk van de plaats waar in de boom u momenteel - het altijd moet de eerder bezochte knooppunt bevatten. Daarvoor wordt telkens thread uitvoeren dient hetzelfde "vorige" variabel referentie. Ik heb een aantal Python-achtige pseudo-code uitgevoerd met een C-isme - als je niet bekend bent, ' & ' betekent "verwijzing naar" (of "ref" in C #), en '*' betekent "dereference en geef me het object waarnaar wordt verwezen".

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

Als je zou gaan om dit te implementeren in C, zou je eigenlijk nodig hebt een dubbele pointer met de referentie te houden, maar het idee is hetzelfde - je nodig hebt om de locatie van de "laatst bezochte knooppunt" aanhouden gedurende het gehele traversal.

antwoordde op 31/07/2009 om 05:36
bron van user

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