Z Twojego opisu, będę zakładać masz węzeł ze strukturą poszukuje coś takiego:
Node {
left
right
}
... i że masz binarne drzewo z nich skonfigurować za pomocą lewej i prawej, a chcesz ponownie przypisać wartości do lewej i prawej strony w taki sposób, że tworzy doublely-linkowane listy z głębokości pierwszego przechodzenia z drzewo.
Korzeń (gra słów nie przeznaczonych) Problem z tym, co masz do tej pory jest to, że „węzeł p” (skrót od poprzedniego?), Które są przekazywane w trakcie przechodzenia musi być niezależny od tego, gdzie w drzewie, które aktualnie są - zawsze musi zawierać poprzednio odwiedzanej węzła. Aby to zrobić, każdy wątek czas prowadzony jest to musi odwoływać się do tego samego „poprzedni” zmienną. Zrobiłem trochę python-owski pseudo kod z jednym C-ism - jeśli nie jesteś zaznajomiony „ & ” oznacza „odniesienie do” (lub „ref” w języku C #) i „*” oznacza „dereference i dać mi celem jest wskazując”.
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
Jeśli jechaliśmy zaimplementować to w C, to rzeczywiście trzeba podwójny wskaźnik trzymać odniesienie, ale idea jest taka sama - trzeba utrzymywać położenie „ostatniej odwiedzonej węzła” podczas całego przechodzenia.