O (n1 * log (n2)) es el caso medio, incluso si tenemos 2 fusionar cualquier lista sin clasificar en una BST. No estamos utilizando el hecho de que la lista es una lista ordenada o una BST.
Según yo Supongamos que un BST tiene elementos n1 y otro tiene elementos n2. Ahora convierta un BST en una lista de matriz ordenada L1 en O (n1).
BST Fusionada (BST, Array)
si (Array.size == 0) de regreso BST si (Array.size == 1) insertar el elemento en el BST. devolver BST;
Encuentra el índice en la matriz cuyo elemento izquierdo < BST.rootnode y elemento de la derecha> = BST.rootnode dicen Índice. si (BST.rootNode.leftNode == null) // es decir, ningún nodo izquierdo { insertar todos los array de Índice a 0 en la izquierda de BST y } otro { BST Fusionada (BST.leftNode, Array { 0 al índice}) }
si (BST.rootNode.rightNode == null) // es decir, ningún nodo derecho { insertar todos los array de índice para Array.size en derecho de BST } otro { BST fusionado (BST.rightNode, matriz {índice a tamaño de matriz}) }
return BST.
Este algoritmo tomará < < tiempo que O (n1 * log (n2)) como cada partición de la matriz y BST para manejar el subproblema.
Insertar la raíz del árbol 1 en el árbol 2 no funcionará en todos los casos. –
Está asumiendo que todos los árboles de búsqueda binarios están equilibrados. (Por ejemplo, los árboles Splay no lo están) También creo que su complejidad está un poco apagada. Como n2 está aumentando, el árbol se hará más profundo a medida que inserte valores. Tal vez (n1 + n2)/2 es una mejor aproximación (Porque al comienzo de la inserción es O (log n2) para insertar y al final es O (log (n1 + n2)). – jabbie
@Evan Teran, a <-c-> h union b <-d-> f por ejemplo, sus rangos [a, h] y [b, f] se superponen y, por lo tanto, ninguno puede insertarse en otro como nodo de hoja –