¿Cuál es el mejor algoritmo de eliminación para un árbol de búsqueda binario sin usar un nodo padre adicional?

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 izquierdos ni elementos secundarios derechos presentes.
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.

  Nodo privado deleteNode (Node rootNode, int data) {
  if (rootNode == null) {
  volver nulo;
  }
  if (data == rootNode.getData ()) {
  if (rootNode.getLeft ()! = null && rootNode.getRight ()! = null) {
  // Encuentra el mínimo del árbol derecho O encuentra el máximo del árbol izquierdo.
  Nodo minNode = getHighestNodeFromRight (rootNode.getRight ());
  rootNode.setData (minNode.getData ());
  rootNode.setRight (deleteNode (rootNode.getRight (), minNode.getData ()));
  System.out.println (minNode);
  } else if (rootNode.getLeft () == null) {
  return rootNode.getRight ();
  }más{
  return rootNode.getLeft ();
  }
  } else if (data> rootNode.getData ()) {
  rootNode.setRight (deleteNode (rootNode.getRight (), data));
  }más{
  rootNode.setLeft (deleteNode (rootNode.getLeft (), data));
  }
  return rootNode;
  }


  Nodo público getHighestNodeFromRight (nodo Nodo) {
  if (node.getLeft () == null) {
  nodo de retorno;
  }más{
  Nodo n = getHighestNodeFromRight (node.getLeft ());
  volver n;
  }
  }

Explicación detallada con el programa completo: eliminar un nodo en el árbol de búsqueda binaria.

¿No podemos eliminar un BST de forma recursiva eliminando en cualquiera de las dos secuencias?
1. Nodo izquierdo, nodo derecho y nodo raíz. O
2. Nodo derecho, nodo izquierdo y nodo raíz.

Ninguno de los dos enfoques anteriores necesita restricciones de memoria adicionales [excepto, por supuesto, espacio recursivo].

Usar recursividad:

  función deleteNode (cabeza, datos)
    SI cabeza = nulo ENTONCES
       volver nulo
    ELSE IF data  head.data ENTONCES
       head.right = deleteNode (head.right, datos)
    ELSE // data = head.data
       SI head.left = nulo ENTONCES
          temp = head.right
          delete (head) // si no hay recolección de basura
          temperatura de retorno
       MÁS SI head.right = nulo ENTONCES
          temp = head.left
          delete (head) // si no hay recolección de basura
          temperatura de retorno
       ELSE // definitivamente existen niños izquierdos y derechos
          head.data = findMin (head.right)
          head.right = deleteNode (head.right, head.data)
       TERMINARA SI
    TERMINARA SI
    cabeza de retorno
 Función END

Llamado con:

  root = deleteNode (raíz, datos)

More Interesting

¿Es posible escribir un método que muestre todos los elementos en una lista enlazada circular?

¿Cómo es constante la cadena STL C_str () cuando la clase misma es como una matriz dinámica?

¿Cuál es el mejor algoritmo?

¿Por qué hay una diferencia de complejidad de tiempo entre los algoritmos de clasificación en Java cuando estoy usando Integer e integer?

¿Cómo funciona el algoritmo de caminante aleatorio para la segmentación de imágenes en términos simples?

15 personas se sentarán en una fila de 15 sillas. ¿Cómo calculo cuántos planes de asientos se pueden hacer, donde dos planes de asientos se consideran iguales si dos planes comparten cuádruples adyacentes? o ¿Cómo puedo crear un algoritmo eficiente para encontrar límites inferiores para 15 o menos personas?

Supongamos que tenemos una matriz 8 * 8. Cada celda tiene 0 o 1. Se le dará una ubicación y deberá encontrar todas las que se encuentran en la misma isla. ¿Los puntos se encuentran en la misma isla si un punto está en alguna de las celdas adyacentes?

¿Cómo se crean los algoritmos y para qué se utilizan?

¿De qué maneras se usan los algoritmos y con qué frecuencia se usan?

¿Cuál es la lista en la estructura de datos?

¿Es cierto que si entendemos los algoritmos podemos entender todos los programas difíciles de todos los idiomas?

En los términos más simples, ¿qué es un algoritmo? ¿Cual es su propósito?

¿Cómo convertirse en un experto en ciencia de datos (aprendizaje automático) que tiene una idea básica de la programación C / C ++? ¿Cuáles son algunos cursos o libros disponibles gratis o baratos?

¿Podemos aplicar Ford-Fulkerson a un gráfico de múltiples fuentes y sumideros múltiples?

Cómo encontrar el número máximo de árboles de expansión mínima en un gráfico