Podemos usar la propiedad El árbol de búsqueda binaria (BST) para encontrar el sucesor y predecesor de un nodo en un BST.
Encontrar el nodo sucesor de un nodo dado:
Aquí hay dos casos:
- Cómo representar el algoritmo de hash SHA256 en python
- Si F2L se resuelve mejor de forma intuitiva, ¿por qué cada tutorial incluye algoritmos para todos los casos de F2L?
- ¿Memcpy es más eficiente que copiar elemento por elemento en bucle iterativo?
- ¿Por qué mi código JavaScript muestra un error de bucle infinito en la línea 7? ¿Por qué no está eliminando los elementos de la matriz de entrada?
- ¿Cuál es la complejidad de tiempo en el peor de los casos para la eliminación en una cola?
1. El nodo tiene un subárbol derecho.
Si el nodo dado tiene un subárbol derecho, entonces, mediante la propiedad BST, la siguiente clave más grande debe estar en el subárbol derecho. Como todas las claves en un subárbol derecho son más grandes que la clave del nodo dado, el sucesor debe ser la más pequeña de todas las claves en el subárbol derecho.
2. El nodo no tiene un subárbol derecho.
En este caso, tendremos que buscar el árbol, ya que ese es el único lugar donde podemos encontrar la siguiente clave más grande. No tiene sentido mirar el subárbol izquierdo, ya que se garantiza que todas las claves en el subárbol izquierdo serán más pequeñas que la clave en el árbol dado.
Cuando miramos hacia arriba desde el nodo dado, puede haber dos casos: primero, el nodo actual es el hijo izquierdo de su padre. En este caso, el padre es el nodo sucesor. Esto se debe a que el padre siempre viene después en el orden transversal si ha terminado con el subárbol izquierdo (arraigado en el nodo actual).
En segundo lugar, el nodo actual es el hijo derecho del padre. Este es un caso interesante. En este caso, a medida que sigue subiendo por la cadena de antepasados, encontrará valores más pequeños si sube, pero valores más grandes si va hacia la derecha. El nodo sucesor será el primer nodo en la cadena ancestral que encuentre en la cadena derecha.
Aquí está el código Java para encontrar el sucesor de un nodo dado. Esto supone una clase TreeNode que representa nodos en el BST:
árbol estático público findSuccessor (nodo TreeNode)
{
if (nodo == nulo)
volver nulo;if (node.getRight ()! = null)
return findMinimum (node.getRight ());TreeNode y = node.getParent ();
TreeNode x = nodo;
while (y! = null && x == y.getRight ())
{
x = y;
y = y.getParent ();
}
// Intuición: a medida que atravesamos el árbol hacia la izquierda, atravesamos valores más pequeños
// El primer nodo a la derecha es el siguiente número más grande
volver y;
}
Encontrar el nodo predecesor sigue una lógica simétrica. Aquí está el código Java para eso:
árbol estático público findPredecessor (nodo TreeNode)
{
if (nodo == nulo)
volver nulo;if (node.getLeft ()! = null)
return findMaximum (node.getLeft ());TreeNode parent = node.getParent ();
TreeNode y = padre;
TreeNode x = nodo;
while (y! = null && x == y.getLeft ())
{
x = y;
y = y.getParent ();
}volver y;
}
He escrito un extenso tutorial sobre BST aquí: http: //exceptional-code.blogspot…