¿Cuál es el mejor algoritmo para eliminar cualquier nodo en un BST?

Hay 3 casos que deben considerarse al eliminar un nodo del Árbol de búsqueda binaria.

1. El nodo a eliminar no tiene elementos secundarios que no sean elementos secundarios izquierdo ni secundario derecho presente.
Caso 1 en la imagen de abajo.
2. El nodo a eliminar solo tiene un hijo, ya sea izquierdo o derecho. Caso 2 en la imagen de abajo.
3. El nodo a eliminar tiene ambos elementos secundarios, izquierdo y derecho. Caso 3 en la imagen de abajo.

Caso 1:
Para el caso 1, es muy sencillo,
1. Busque el nodo que debe eliminarse.
2. El nodo a eliminar está en el lado izquierdo o en el lado derecho de su nodo padre.
3. Si el nodo que se va a eliminar está en el lado izquierdo de su nodo padre, marque el lado izquierdo del nodo padre como nulo.
Por ejemplo: parent.setLeft (nulo);
4. Si el nodo que se va a eliminar está en el lado derecho de su nodo padre, marque el lado derecho del nodo padre
a nulo. Por ejemplo: parent.setRight (nulo);

Caso 2:
Para el caso 2, es muy sencillo,
1. Busque el nodo que debe eliminarse.
2. El nodo a eliminar está en el lado izquierdo o en el lado derecho de su nodo padre.
3. El nodo a eliminar solo tiene un elemento secundario presente que puede estar en el lado izquierdo o derecho.
4. Si el nodo a eliminar ha dejado un niño presente,
luego conecte directamente su nodo primario al nodo secundario izquierdo del nodo que se va a eliminar.
Por ejemplo: parent.setLeft (child.getLeft ());
5. Si el nodo que se va a eliminar tiene un hijo secundario presente,
luego conecte directamente su nodo primario al nodo secundario derecho del nodo que se va a eliminar.
Por ejemplo: parent.setRight (child.getRight ());
6. De esta forma, el nodo que se eliminará se eliminará del árbol y el nodo principal
se conectará directamente al nodo secundario del nodo que se eliminará.

Caso 3:
Para el caso 3, es un poco complicado
1. Busque el nodo que debe eliminarse.
2. Ahora, en lugar de eliminar el nodo, reemplazaremos los datos del nodo que se eliminará
con los datos que mejor se ajusten a ese lugar.

3. ¿Qué datos se ajustarán mejor? Busque los datos del subárbol del nodo que se va a eliminar y
encontrar el nodo cuyos datos cuando se colocan en el lugar del nodo que se eliminará
mantener la propiedad del árbol de búsqueda binaria (la clave en cada nodo debe ser mayor
que todas las claves almacenadas en el subárbol izquierdo, y más pequeñas que todas las claves en el subárbol derecho) intactas.

4. Encuentre el elemento mínimo del subárbol derecho del nodo que se va a eliminar o
encuentre el elemento máximo del subárbol izquierdo del nodo que se va a eliminar y
copie los datos de ese nodo a los datos del nodo que se va a eliminar.
5. Elimine el nodo que encontramos el mejor ajuste en el paso 5.

Explicación detallada con el Programa completo: Eliminar un nodo en el Árbol de búsqueda binaria.

Los mejores algoritmos posibles para BST son siempre aquellos en los que la altura del árbol disminuye o permanece igual. Tal algoritmo para la eliminación de un elemento es el siguiente.
Encuentre el nodo que desea eliminar, digamos N, atravesando el BST por el recorrido de profundidad primero. Se deben manejar 3 casos.
Caso I: el nodo no tiene hijos.
Simplemente elimine el elemento y ya está.
Caso II: el nodo tiene un hijo.
Eliminar N. Ahora solo adjunte el subárbol cuya raíz es el hijo de N, al padre de N, reemplazando así el lugar ocupado anteriormente por N por su hijo.
Caso III: el nodo tiene dos hijos.
Hay dos formas en que puedes hacer esto. Describiré uno; el otro es análogo. Primero encuentre el elemento del BST que viene justo antes de N en el recorrido en orden del BST. Puede hacer esto yendo al hijo izquierdo de N, y luego moviéndose a la derecha en el BST (es decir, yendo al hijo derecho del nodo) continuamente hasta llegar a un nodo sin hijo derecho, diga M. Ahora, simplemente reemplace el contenido de N por M (¡Piensa por qué puedes hacer eso!). Este caso ahora se reduce a Caso I (el caso sin hijo) o Caso II, es decir, eliminación de un nodo que solo tiene un hijo (en este caso M, que solo ha dejado hijo). Otra forma de manejar el Caso III es reemplazando N por el nodo que viene inmediatamente después de N en el recorrido en orden del BST. Un caso afín, ¿verdad?

El algoritmo para eliminar un nodo de BST se llama algoritmo de eliminación de Hibbard (llamado así por su fundador Hibbard, quien describió el algoritmo por primera vez en 1962)
El truco para eliminar un nodo de BST proviene del hecho después de la eliminación, el árbol resultante también debería ser un BST.
Hay tres casos:
Caso # 1: El nodo a ser eliminado no tiene hijos.
En este caso, simplemente podemos eliminar el nodo. El nodo principal que vincula este nodo es
solo se establece en nulo.
Caso # 2: El nodo a eliminar tiene un subárbol, es decir, subárbol izquierdo o derecho.
En este caso, hacemos que el nodo padre del nodo eliminado apunte al subárbol del nodo eliminado, ya sea a la izquierda o a la derecha en consecuencia.
Caso n. ° 3: el nodo que se va a eliminar tiene dos hijos, es decir, tiene subárboles izquierdo y derecho
Este es el caso para pensar, ya que después de la eliminación, no podemos simplemente reemplazar el nodo eliminado con uno de sus subárboles porque nos quedaremos con otro subárbol. Esto significa que el nodo eliminado debe ser reemplazado por otro nodo seleccionado de los subárboles y luego eliminar de forma recursiva el nodo que seleccionamos del subárbol en el que está presente.
La pregunta es ¿cuál es el nodo que debemos elegir para reemplazar el nodo eliminado? El nodo elegido debe mantener la propiedad BST. Esto requiere dos posibilidades: (1) elegir el nodo en el subárbol derecho con el valor más pequeño (2) elegir el nodo en el subárbol izquierdo con el subárbol más grande. (En el código de demostración, uso la opción (1))
La complejidad de esta eliminación es claramente proporcional a la altura del árbol.
Las eliminaciones frecuentes harán que el árbol quede sesgado, aumentando así su altura (en el peor de los casos, se vuelve tan grande como n, el número de nodos)
Código Haskell:

  data BinaryTree a = Empty
                     El |  Nodo a (BinaryTree a) (BinaryTree a)
                     derivando (Eq, Ord, Show)
 listToBST :: (Ord a) => [a] -> BinaryTree a
 listToBST [] = Vacío
 listToBST (x: xs) = Nodo x (listToBST (filtro (<= x) xs))
                            (listToBST (filtro (> x) xs))
 deleteBST :: (Ord a) => a -> BinaryTree a -> BinaryTree a
 deleteBST _ Empty = Empty
 deleteBST x t '@ (Nodo a izquierda derecha)
          El |  x  a = Nodo a izquierda (deleteBST x derecha)
          El |  de lo contrario = let
                         minElement :: BinaryTree a -> a
                         minElement (Nodo a Empty _) = a
                         minElement (Node _ l _) = minElement l
                         deleteBST ':: (Ord a) => a -> BinaryTree a -> BinaryTree a
                         deleteBST '_ (Nodo _ l Vacío) = l 
                         deleteBST '_ (Nodo _ Vacío r) = r
                         deleteBST '_ (Nodo _ lr) = let 
                                                         me = minElement r
                                                         r '= deleteBST me r 
                                                     en
                                                          Nodo me l r '
                         en 
                           deleteBST 'x t'

More Interesting

¿Vale la pena el tiempo para obtener una maestría en CS o para aprender a codificar y asistir a un campamento de entrenamiento de codificación?

¿Por qué no puedo conseguir un trabajo de desarrollador front-end simplemente por una entrevista técnica, a pesar de haber trabajado 6 años como desarrollador y sé lo que estoy haciendo?

¿Debo escribir un javadoc durante una entrevista de codificación?

Cómo prepararme para una entrevista para un puesto de diseñador de juegos

Dada una matriz de números y una constante k, ¿minimizar el tamaño de la matriz con las siguientes reglas para eliminar elementos? (Más detalles en la primera respuesta).

¿Cuándo fue tu primera entrevista? ¿Como le fue? ¿Qué aprendiste de esa experiencia? ¿Cómo te preparaste para la entrevista?

¿Rob Pike escribió Quicksort en C para su entrevista en Google? Dudo que recuerde el algoritmo, pero 'tienes que pasar por la entrevista de codificación'.

¿Cómo es estar en una entrevista técnica?

¿Su solución tiene que ser perfecta para codificar entrevistas?

Cómo escribir un código más limpio durante las entrevistas en el sitio

Cómo reorganizar una matriz determinada para que Arr [I] se convierta en Arr [Arr [I]] con O (1) espacio adicional

¿Cuándo debo esperar una decisión de entrevista técnica en el sitio? Pensé que estaban tan impresionados por mí que me ofrecerán el mismo día.

¿Cómo podemos devolver los números K máximos de una matriz entera sin clasificar?

¿Algoritmo de libros o proyecto de código abierto para ser contratado por empresas tecnológicas de San Francisco como Google?

¿Cómo me preparo para una entrevista in situ para el rol de ingeniero de desarrollo de software en Amazon Hyderabad?