¿Algoritmo de combinar dos árboles binarios?

Por ejemplo:

dos árboles :

       8                   9
   5        7          4       20
                    30

convertirse en un árbol?

preguntado el 08 de enero de 11 a las 17:01

@WM: ¿Eres el árbol final a equilibrar? ¿Ordenado? -

No, no lo son, es un árbol binario, no un árbol de búsqueda binario. -

3 Respuestas

Sin más detalles / restricciones, la solución más simple es tomar un nodo hoja de cualquiera de los árboles, eliminarlo y usarlo como raíz de los tres recién creados.

En tu ejemplo:

             30
    8                   9
5        7          4       20

Esto funciona porque sus árboles no parecen seguir ningún orden en particular, no parecen estar equilibrados ni tienen ninguna otra restricción.

Dado que cualquier nodo hoja servirá, esta es una O(n) en el peor de los casos (atravesar uno de los árboles en cualquier orden hasta que encontremos la primera hoja, eliminarla, agregar enlaces secundarios a las raíces de ambos árboles).

Respondido el 08 de enero de 11 a las 21:01

No veo cómo se obtiene el árbol resultante usando ese algoritmo. Y es O (N) en el peor de los casos de un árbol degenerado (lista enlazada). - Moinudin

@marcog: tienes razón sobre el tiempo de ejecución. Supuse que se encontraría el nodo superior. Estúpido por supuesto. Aún así, el árbol se puede obtener usando el algoritmo descendiendo (arbitrariamente) por las ramas más a la izquierda en el segundo árbol. - Konrad Rudolph

Ah, veo lo que estás haciendo ahora. Buena solucion. +1 - Moinudin

La forma más fácil de fusionar dos árboles binarios es recorrer en iteración el hijo izquierdo de un árbol hasta llegar a un nodo sin un hijo izquierdo. Luego agregue la raíz del otro árbol como hijo izquierdo. El árbol resultante para su ejemplo será:

            8
        5        7
    9
  4  20
30

Sin embargo, observe cómo el árbol resultante en este ejemplo está muy desequilibrado. Esto resultará en operaciones ineficientes en el árbol resultante, si esta es la intención. Una mejor solución es distribuir uniformemente los nodos del segundo árbol al primer árbol. Una forma de lograr esto es agregar recursivamente la raíz y el subárbol izquierdo del segundo árbol al subárbol izquierdo del primer árbol, y el subárbol derecho al subárbol derecho. Para una distribución ligeramente más uniforme, seleccione al azar a qué lado asignar la raíz en cada paso.

Tenga en cuenta que los árboles binarios aquí son no es árboles de búsqueda binaria. Trabajar con BST es un caso un poco más interesante, ya que debe asegurarse de que el árbol resultante también sea un BST válido. Para los interesados, aquí hay una solución para ese problema: busque el valor raíz del árbol 2 en el árbol 1. Si llegamos a un callejón sin salida sin haber encontrado este valor, podemos simplemente insertar el árbol 2 en la ubicación donde el valor sería si estuviera en el árbol. Si encontramos el valor, entonces podemos reemplazar ese nodo con el árbol 2. Luego tomar el subárbol enraizado en el nodo que desplazamos e insertarlo en el árbol 2 usando el mismo algoritmo.

Respondido el 08 de enero de 11 a las 20:01

¿Es esa realmente la forma correcta de hacerlo? (Últimamente estoy oxidado con los bi-árboles). BoltClock ♦

Bueno, agregué una solución para BST si alguien está interesado / si esa termina siendo la respuesta deseada. - Moinudin

@marcog, se perdió que el árbol original no estaba ordenado / balanceado, por lo que tiene razón: los fusiona en un árbol, pero no es muy útil para la búsqueda. - Thorbjørn Ravn Andersen

@Tho La búsqueda no es el único uso de árboles binarios. :) Sin más información de OP, realmente no podemos especializar el árbol resultante. - Moinudin

La respuesta básica sería simplemente agregar todos los elementos del árbol más pequeño al árbol más grande.

Otra posibilidad sería mirar en B-Trees (árboles autoequilibrados)

Respondido el 08 de enero de 11 a las 20:01

Probablemente podría hacerlo mejor que esto si tiene más detalles de implementación. Pero si esta no es su funcionalidad principal, debe evitar demasiada optimización. Esto es mejor porque le permitirá cambiar la implementación del árbol en el futuro. - Mihai Toader

Los árboles B son estructuras muy diferentes y, lo que es más importante, no son árboles binarios. - Moinudin

Sí, pero si el autor de la pregunta no los conocía, pensé que sería bueno mencionarlo. Kurru

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.