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.