Z vašeho popisu, budu předpokládat, že máte uzel s konstrukcí hledá něco jako:
Node {
left
right
}
... a že máte binární strom z nich nastavit pomocí levé a pravé, a že chcete znovu přiřadit hodnoty vlevo a vpravo tak, že vytváří doublely připojený seznam z hloubky první průchod strom.
Kořen (žádná slovní hříčka určena), problém s tím, co jste se dostal tak daleko, že je „uzel p“ (zkratka pro předchozí?), Který je předán při přejíždění musí být nezávislý na tom, kde ve stromu se právě nacházíte - vždycky musí obsahovat dříve navštívených uzel. K tomu, že pokaždé, když vlákno je běh je třeba odkazovat na stejnou „předchozí“ proměnnou. Udělal jsem nějaké Python-ish pseudo kód s jedním C-ismus - pokud nejste obeznámeni, ‚ a ‘ znamená „odkaz na“ (nebo „ref“ v jazyce C #), a ‚*‘ znamená „dereference a dej mi objekt je směřující k“.
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
Pokud jste se bude provádět toto v jazyce C, měli byste skutečně potřebují dvojí ukazatel držet referenci, ale myšlenka je stejná - je třeba vytrvat umístění „posledního navštíveného uzlu“ v průběhu celého průchod.