O (n1 * log (n2)) является средним сценарием, даже если у нас есть 2 слияния любого несортированного списка в BST. Мы не используем тот факт, что список отсортирован или BST.
По мне Предположим, что один BST имеет элементы n1, а другой имеет n2 элементов. Теперь конвертируйте один BST в список отсортированных массивов L1 в O (n1).
Merged БСТ (БСТ, массив)
, если (Array.size == 0) возвращают BST , если (Array.size == 1) вставить элемент в BST. return BST;
Найти индекс в массиве, левый элемент < BST.rootnode и правый элемент> = BST.rootnode say Index. если (BST.rootNode.leftNode == NULL) // т.е. без левого узла { вставить все массив из индекса 0, в левом из BST и } еще { Merged BST (BST.leftNode, массив { 0 Индекс})}
если (BST.rootNode.rightNode == NULL) // т.е. нет права узла { вставить все массив из индекса не Array.size в праве BST } еще { Объединенный BST (BST.rightNode, Array {Index to Array.size}) }
возвращение BST.
Этот алгоритм будет принимать < < времени, чем O (n1 * log (n2)), поскольку каждый раз, когда мы разбиваем массив и BST, обрабатываем подзадачу.
Вставка корня дерева 1 в дерево 2 не будет работать в каждом случае. –
Вы принимаете предположение, что все двоичные деревья поиска сбалансированы. (Например, деревья Splay не являются) Также, я думаю, что ваша сложность немного отключена. Поскольку n2 увеличивается, дерево будет становиться все глубже, когда вы вставляете значения. Может быть, (n1 + n2)/2 является лучшим приближением (потому что в начале вставки O (log n2) вводится, а в конце это O (log (n1 + n2)). – jabbie
@Evan Teran, a <-c-> h union b <-d-> f, например, их диапазоны [a, h] и [b, f] перекрываются и, следовательно, ни один из них не может быть вставлен в другой как листовой узел –