Java (lenguaje de programación): ¿Es correcto este método para insertar un nuevo nodo en un árbol de búsqueda binario?

Pocas cosas creo que se pueden hacer aquí:

  1. cuando la raíz es nula, simplemente agregue un nuevo nodo y regrese para que no necesite otro bloque.
  2. ¿Por qué usar 2 punteros diferentes?
  3. parent = current se ha hecho en el bloque if y else, que parece un código duplicado

Traté de poner mis cambios aquí … Avísame si satisface tus necesidades …

  inserción vacía pública estática (clave int)
 {
 Nodo newNode = nuevo nodo (clave);
                 if (raíz == nulo)
                 {
                     root = newNode;
                     regreso;
                 }
                 Nodo actual = raíz;
                 mientras (cierto)
                 {               
                     if (current.key <clave)
                     {
                         if (current.right == nulo)
                         {
                             current.right = newNode;
                             regreso;
                         }
                     current = current.right;
                 }
                 más
                 {
                     if (current.left == null) 
                     {
                         current.left = newNode;
                         regreso;
                     } 
                     current = current.left;
                 }
             }  
 }

Definitivamente puedes hacerlo de esa manera. Es casi correcto: un BST no permite valores duplicados, pero los está permitiendo aquí.

No estoy entusiasmado con tu ciclo while (verdadero). Preferiría while (current! = Null), pero luego necesitarías un poco de delicadeza para el caso add-left vs. add-right cuando te salgas del ciclo. A partir de ahí, el caso raíz nulo puede ser menos un caso especial. Lo que no hace que su código sea incorrecto.

Los árboles binarios pueden darle algunas ideas sobre cómo hacerlo mejor. No tienen el ciclo while en absoluto, sino que utilizan la recursividad. ¿Alguna razón para que seas tímido acerca de la recursividad cuando te enfrentas a una estructura tan recursiva como los árboles?

EDIT2: Gracias a Dios, la moderación de Quora decidió separar la pregunta no BST de la pregunta BST …

EDITE ahora que esta respuesta se fusionó con otra pregunta un tanto similar (“¿Cómo inserto un nuevo nodo en un árbol binario (no buscar árbol binario)?”): Si no mantiene ningún orden en su árbol binario (porque no es un BST) entonces, ¿por qué tener un árbol binario? Una simple lista vinculada parece ser suficiente. En lugar de los punteros izquierdo y derecho en cada nodo, puede tener punteros hacia adelante y hacia atrás para una lista doblemente vinculada o tal vez solo necesitaría un puntero directo si una lista vinculada individualmente cumpliera con sus requisitos.

Un árbol binario sin ningún orden pierde la ventaja habitual de un árbol binario: poder encontrar un nodo por su valor clave en el tiempo de registro N. Entonces, ¿cuál es su motivo para querer un árbol binario?

¿Tiene el requisito de mantener su árbol como un árbol equilibrado (es decir, minimizar la profundidad del árbol? Si no es así, siempre podría simplemente colocar el nuevo nodo como la nueva raíz del árbol y reposicionar el árbol viejo debajo del nuevo nodo. Así radicalmente un árbol desequilibrado pronto se parece más a una lista que a un árbol, lo que nos devuelve a mi pregunta de por qué su pregunta requería un árbol binario.

Si es correcto.