Aus Ihrer Beschreibung, nehme an, ich Ihnen einen Knoten mit einer Struktur sucht so etwas wie:
Node {
left
right
}
... und dass Sie einen binären Baum von diesem mit den linken und rechten einrichten, und dass Sie Werte neu zu assign nach links und rechts, so dass es eine doublely-linked-Liste aus einem Tiefen ersten Durchlauf der schafft Baum.
Die Wurzel (kein Wortspiel beabsichtigt) Problem mit dem, was Sie bisher bekommen habe , ist , dass der „Knoten p“ (kurz für vorherige?) , Die während der Überquerung übergeben wird , muss unabhängig davon sein , wo im Baum Sie sich gerade befinden - es immer muss die zuvor besuchten Knoten enthalten. Um dies zu erreichen , wird jedes Mal Thread ausgeführt es den gleichen „vorherigen“ Variable verweisen muss. Ich habe einigen Python-ish Pseudo - Code mit einem C-ism getan - wenn Sie nicht vertraut sind, ‚ & ‘ bedeutet „ die Bezugnahme auf“ (oder „ref“ in C #) und ‚*‘ bedeutet „dereferenzieren und gib mir das Objekt , um es zeigt auf“.
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
Wenn Sie dies in C implementieren würden, dann werden Sie brauchen eigentlich einen Doppelzeiger die Referenz zu halten, aber die Idee ist das gleiche - Sie die Lage des „zuletzt besuchten Knoten“ während der gesamten Traversal bestehen bleiben müssen.