Cómo insertar un nuevo nodo en un árbol binario (no buscar árbol binario)

Comience a escanear un árbol binario nivel por nivel y donde sea que encontremos una posición vacante, coloque un nuevo nodo allí.

Algoritmo:

Comience a escanear todos los niveles (nivel por nivel) de un árbol uno por uno hasta que encontremos un nodo cuyo nodo izquierdo o derecho sea nulo.

Para todos y cada uno de los nodos, ¿debemos verificar si existen los nodos izquierdo y derecho?

Si existe, entonces ese nodo no es útil para agregar un nuevo nodo, pero necesitamos almacenar el hijo izquierdo y derecho de ese nodo para su posterior procesamiento. se almacena en la cola para su colocación secuencial.

Si no existe, entonces encontramos un nodo, donde se colocará un nuevo nodo pero no está seguro a la izquierda o derecha, así que verifique qué hijo es nulo y coloque el nuevo nodo allí.

Vea la imagen de arriba para comprender mejor la posición de un nuevo Nodo para insertar.
Dado un árbol binario, necesitamos agregar un Nodo con el valor 8 marcado en líneas punteadas arriba en su posición correcta.

árbol de paquete;
import java.util.LinkedList;
import java.util.Queue;

clase pública AddNodeInBinaryTree {
Nodo privado rootNode;

public static void main (String [] args) {
nuevo AddNodeInBinaryTree ();
}

AddNodeInBinaryTree público () {
addNodeInBinaryTree (rootNode, 1);
addNodeInBinaryTree (rootNode, 2);
addNodeInBinaryTree (rootNode, 3);
addNodeInBinaryTree (rootNode, 4);
addNodeInBinaryTree (rootNode, 5);
printTreeLevelOrder (rootNode);
}

// Forma iterativa de agregar un nuevo nodo en el árbol binario.
privado void addNodeInBinaryTree (Node rootNode, int data) {
if (rootNode == null) {
// No hay nodos presentes, cree uno y asígnelo a rootNode
this.rootNode = nuevo nodo (datos);
}más{
// Nodos presentes, por lo que se verifica la posición vacante para agregar un nuevo nodo en forma secuencial

Queue q = new LinkedList ();
q.add (rootNode);
while (! q.isEmpty ()) {
Nodo nodo = q.poll ();
if (node.getLeft ()! = null && node.getRight ()! = null) {
q.add (node.getLeft ());
q.add (node.getRight ());
}más{
if (node.getLeft () == null) {
node.setLeft (nuevo nodo (datos));
}más{
node.setRight (nuevo nodo (datos));
}
rotura;
}
}
}
}

privado vacío printTreeLevelOrder (Node rootNode) {
if (rootNode == nulo)
regreso;
Queue q = new LinkedList ();
q.add (rootNode);
while (! q.isEmpty ()) {
Nodo nodo = q.poll ();
System.out.print (node.getData () + “”);
if (node.getLeft ()! = null)
q.add (node.getLeft ());
if (node.getRight ()! = null)
q.add (node.getRight ());
}

}
}

Explicación detallada: agregue un nodo en árbol binario y no un árbol de búsqueda binaria.

Sin ninguna restricción? La respuesta de Gregory es buena y probablemente daría un rendimiento de inserción similar a un BST real. De lo contrario, si está buscando velocidad y tiene cero restricciones, simplemente inserte en la raíz. Tendrás un árbol binario degenerado, pero si eso te molesta, puedes intentar lo siguiente:

  1. Utilice un DFS o BFS con una profundidad limitada para buscar un nodo con un hijo nulo.
  2. Si se encuentra un niño nulo, inserte la nueva clave en este punto nulo.
  3. Si no se encuentran espacios libres, inserte en la raíz.

Esto le da a su operación de inserción un rendimiento de tiempo constante, a expensas de las operaciones de recuperación y eliminación que tendrán un rendimiento O (n).

Me siento obligado a agregar que un árbol binario sin restricciones de orden es básicamente una lista enlazada desordenada.

Si no le va a interesar el equilibrio, simplemente pase directamente al lado izquierdo o al lado derecho. No importa de qué lado estará. Pero si le va a interesar el equilibrio, preferiría encontrar un nodo vacío en el nivel inferior del árbol. Para hacerlo, puede escribir una función para calcular el nivel del árbol, y también con esa función puede buscar un nodo vacío en el último nivel. No importa si comienza su búsqueda de izquierda a derecha o de derecha a izquierda. Cuando encuentre un lugar, ponga sus nuevos datos allí.

Si el árbol es puramente aleatorio, simplemente seleccione el nodo izquierdo o el nodo derecho al azar y recorra el árbol de forma aleatoria hasta que el nodo seleccionado sea un nodo nulo. El reequilibrio no debería ser necesario, pero podría considerarse una opción.

Puede usar los valores ASCII de los alfabetos para almacenar en el Árbol de búsqueda binaria. Los valores ASCII son numéricos, por lo que pueden almacenarse fácilmente.