Encuentra el sucesor sin utilizar puntero padre

votos
1

El sucesor de un elemento en un BST es el sucesor del elemento en el orden de clasificación determinado por el recorrido en orden. Encontrar el sucesor cuando cada nodo tiene un puntero a su nodo padre se presenta en el algoritmo de libro de texto de CLRS (Introducción a los algoritmos por MIT Press).

La idea de encontrar el sucesor aquí es - si el subárbol derecho del nodo xes no vacío, el sucesor de xes el elemento mínimo en el subárbol derecho. De lo contrario, el sucesor es el antepasado más bajo de xcuyo hijo izquierdo es también un antepasado de x(suponiendo un nodo es un antepasado de sí mismo).

Podemos encontrar el sucesor sin utilizar el puntero al nodo padre?

A veces nuestra nodo del árbol no tiene este puntero. Me ha costado un par de horas, pero no puedo escribir el código correcto.

Publicado el 26/09/2010 a las 00:39
fuente por usuario
En otros idiomas...                            


5 respuestas

votos
0

Si no tiene acceso al puntero al nodo padre, entonces usted necesita saber quién es el padre. Si no lo saben, cómo se puede ir arriba en el árbol?

Respondida el 26/09/2010 a las 00:55
fuente por usuario

votos
2

Esto debería funcionar:

TREE-SUCCESSOR(T, x)
  if right[x] != NIL
    return TREE-MINIMUM(right[x])
  else
    return FIND-TREE-SUCCESSOR(root[T], x, NIL)

FIND-TREE-SUCCESSOR(y, x, c)
  if y = x
    return c
  if key[x] < key[y]
    return FIND-TREE-SUCCESSOR(left[y], x, y)
  else
    return FIND-TREE-SUCCESSOR(right[y], x, c)

FIND-TREE-SUCCESSORmantiene en c(del candidato) el último nodo en el que giró a la izquierda.

Respondida el 26/09/2010 a las 01:15
fuente por usuario

votos
5

Inspirado por la solución de Sheldon, esta es la versión no recursiva de la solución.


if (right[x]  != NIL)
    return min(right[x]);
else
{
    candidate = NIL;
    y = root; 
    while  (y!= x) // y is used as a probe
if (key[x] < key[y]) { candidate = y; y = y ->left;
} else y = y->right; } return candidate;
Si el candidato == nada, X es el máximo en el árbol y no tiene un sucesor.

Respondida el 26/09/2010 a las 18:17
fuente por usuario

votos
1

He encontrado una solución elegante para sucesor en orden y sin puntero padre aquí -> http://www.geeksforgeeks.org/archives/9999

idea es

1. Si el nodo tiene sub-árbol de la derecha, a continuación, su sucesor es el elemento más pequeño en el derecho de sub-árbol

  1. Si el derecho de sub-árbol del nodo está vacío, entonces su sucesor es uno de sus antepasados, que se pueden encontrar de arriba hacia abajo y sin puntero del padre, con el siguiente algoritmo:

dejar que inicialmente current_node ser root, succ_node = null;

Caso 1: Si el elemento de búsqueda es inferior a current_node, entonces el elemento actual es un sucesor potencial - lugar succ_node en el current_node y mover el current_node a su nodo izquierda (porque el elemento de búsqueda se encuentra en el subárbol izquierdo)

Caso 2: Si el elemento de búsqueda es mayor que current_node, no es un potencial sucesor (¿Cómo puede ser un elemento menor del sucesor?). Por lo tanto no hay necesidad de colocar el succ_node aquí, pero mover el current_node a derecha.

seguir repitiendo el proceso hasta llegar a un valor nulo o el propio elemento y devolver el succ_node.

Respondida el 13/09/2012 a las 01:17
fuente por usuario

votos
0

Una solución de Java recursivo podía mirar la siguiente manera:

public Integer successor(Integer value) {
    Node n = succ(root, value, null);
    if (null != n) {
       return n.value;
    }
    return null;
}

private Node succ(Node n, Integer x, Node p) {
    if (null == n) {
        return null;
    }

    if (x < n.value) {
        return succ(n.left, x, n);
    } else if (x > n.value) {
        return succ(n.right, x, p);
    }
    if (null != n.right) {
        return min(n.right);
    }
    return p;
}

Como cliente simplemente pase en el valor del nodo desde el que queremos conocer el sucesor. Entonces comenzamos a buscar desde la raíz hasta que encontramos el valor que buscábamos. Ahora bien, hay dos casos:

  1. Si el nodo actual tiene un hijo derecho, entonces el sucesor, el elemento más pequeño en el subárbol derecho del nodo actual
  2. De lo contrario, era el nodo p (puntero padre), que sólo se actualiza cuando se fue a la izquierda dentro del árbol
Respondida el 09/09/2013 a las 17:41
fuente por usuario

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