¿Es así como se elimina de un árbol de búsqueda binario cuando un padre tiene dos subárboles?

Sí, esa es una forma correcta. Al eliminar un nodo con dos hijos, tiene dos opciones igualmente buenas.

Opción 1: intercambie los datos en el nodo con su nodo sucesor de orden, y luego elimine el nodo que contiene el valor a eliminar, es decir, el sucesor de orden.

Opción 2: intercambie los datos en el nodo con su nodo predecesor en orden y luego elimine el nodo predecesor en orden.

Puede encontrar el sucesor del pedido dando un paso a la derecha y luego yendo lo más a la izquierda posible (es decir, hasta llegar a un nodo sin hijo izquierdo). Del mismo modo, puede encontrar el predecesor en orden dando un paso a la izquierda y luego yendo lo más a la derecha posible. Tanto el sucesor como el predecesor no pueden tener dos hijos. Por lo tanto, eliminar este nodo es eliminar la hoja o eliminar un caso secundario, los cuales son fáciles.

La elección realizada en su ejemplo fue la opción 1. Para encontrar el sucesor de orden de 30, avance una vez a la derecha, a 45, y luego vaya lo más a la izquierda posible, que permanece en 45. Ahora intercambie los elementos de datos en estos dos nodos para que el nodo que antes contenía 30 ahora contenga 45. El nodo que ahora contiene 30 tiene un hijo, por lo que puede eliminarlo “empalmándolo” del árbol.

Otro ejemplo sería eliminar 20 que está en el nodo raíz. Para obtener el sucesor de orden, debe avanzar hacia la derecha (a 30 en el árbol original) y luego ir lo más a la izquierda posible: a 25, luego a 22. Intercambia los elementos de datos y luego elimina el nodo sucesor.

Ambas opciones mantienen la relación de orden para que el árbol siga siendo un árbol de búsqueda, además de que no hay ningún nodo para el que la ruta de búsqueda aumente de longitud, por lo tanto, el tiempo de búsqueda no aumenta para ningún nodo. Todos los nodos en el subárbol enraizados en el sucesor / predecesor tienen su longitud de ruta de búsqueda reducida en 1 (la longitud de la ruta de búsqueda al nodo sucesor / predecesor puede reducirse en más de uno).

Cuando tenemos que eliminar un nodo con dos hijos, tenemos dos opciones. Digamos que el nodo que se va a eliminar tiene la clave X.

  1. Reemplace la clave del nodo actual con su predecesor y luego active la eliminación para el predecesor en el subárbol izquierdo del nodo.
  2. Reemplace la clave del nodo actual con su sucesor y luego active la eliminación para el predecesor en el subárbol derecho del nodo.

Puede obtener más información con visualizaciones paso a paso y código aquí: Árboles binarios y Árboles de búsqueda binaria.

La única regla es que debe preservar la invariante: dado cualquier nodo interno:

  • Todos los nodos en el subárbol izquierdo son más pequeños
  • Todos los nodos en el subárbol derecho son más grandes.

Lo único que realmente importa es que se conserva ese invariante.

Al eliminar 30, puede promover 25 (e insertar el subárbol enraizado en 45 debajo de eso) o 45 (e insertar el subárbol rootee en 25 debajo de eso).

La última opción fue elegida.

(Tenga en cuenta que la inserción fue simple en este caso porque ambos subárboles tienen un solo hijo).

Esa es una forma.

El otro es usar el nodo 25 en su lugar (que apuntaría a 45).

Por cierto, estos no son árboles equilibrados que son más rápidos de buscar.

More Interesting

¿Cómo puedo calcular de manera eficiente el número de intercambios requeridos por los métodos de ordenación lenta como la ordenación por inserción y la ordenación por burbujas para ordenar una matriz determinada?

¿De dónde viene la palabra algoritmo?

¿Cuál es el algoritmo de la suma de los primeros 20 números naturales?

¿Por qué debería aprender algoritmos antes de entrar en la programación?

¿Es posible proporcionar un análisis de complejidad para todos los algoritmos en términos de theta?

Si está utilizando Java durante las entrevistas algorítmicas, ¿puede omitir las clases de escritura y acceder directamente a los métodos?

¿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?

¿Por qué no hablamos de O grande para algoritmos de aprendizaje automático?

¿Cuál es el algoritmo de programación monotónico de velocidad en los sistemas operativos?

Programación de computadoras: Como ingeniero de software, ¿qué cosas crees que son "innecesariamente complicadas"?

Cómo ordenar diagonales de una matriz 2D de manera eficiente

¿Cómo podemos resolver el siguiente problema en O (n)?

¿Cuáles son algunos algoritmos fáciles de implementar para la localización basada en características o puntos de referencia de robots móviles 2-D?

¿Por qué una elección de K es mejor que otras en el algoritmo K-means?

¿Cómo funciona el algoritmo de fijación de precios de Megabus?