Según su descripción, asumiré que tiene un nodo con una estructura que se parece a algo como:
Node {
left
right
}
... y que tiene un árbol binario de estas configuraciones usando la izquierda y la derecha, y que quiere volver a asignar valores a la izquierda y a la derecha de manera que cree una lista doblemente enlazada desde un primer cruce de profundidad del árbol.
El problema raíz (sin juego de palabras) con lo que has obtenido hasta ahora es que el "nodo p" (¿abreviatura de anterior?) Que se pasa durante el recorrido debe ser independiente del lugar en el árbol en el que te encuentras actualmente - siempre necesita contener el nodo visitado previamente. Para hacer eso, cada vez que se ejecuta el hilo, necesita hacer referencia a la misma variable "anterior". He hecho un pseudo código Python-ish con un C-ismo. Si no estás familiarizado, " & " significa "referencia a" (o "ref" en C #), y "*" significa "desreferencia y dame" el objeto al que apunta ".
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
Si fuera a implementar esto en C, realmente necesitaría un doble puntero para mantener la referencia, pero la idea es la misma: debe persistir la ubicación del "último nodo visitado" durante todo el recorrido.