Enderezar un árbol binario

votos
0

Estoy teniendo un infierno tratando de resolver esto. Donde sea que mire, parece que solo estoy encontrando explicaciones sobre cómo atravesar la lista de forma no recursiva (la parte que realmente entiendo). ¿Puede alguien por ahí averiguar exactamente cómo puedo pasar por la lista inicialmente y encontrar los nodos predecesores / sucesores actuales para poder marcarlos en la clase de nodo? Necesito poder crear un árbol de búsqueda binaria simple y revisar la lista y redirigir los enlaces nulos al predecesor / sucesor. He tenido algo de suerte con una solución similar a la siguiente:

thread(node n, node p) {
     if (n.left !=null)
        thread (n.left, n);
     if (n.right !=null) {
        thread (n.right, p);
     }
     n.right = p;
}
Publicado el 29/07/2009 a las 19:11
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
1

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.

Respondida el 31/07/2009 a las 05:36
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more