Предположите, что у меня есть два дерева AVL и что каждый элемент от первого дерева меньше тогда любой элемент от второго дерева. Что самый эффективный путь состоит в том, чтобы связать их в одно единственное дерево AVL? Я искал везде, но ничто не нашел полезным.
Предполагая, что вы можете уничтожить входные деревья:
Таким образом, вся операция может быть выполнена в O (log n).
Редактировать: на второй мысль легче рассуждать о вращении в следующем алгоритме. Это также довольно быстрее:
левого
дерева (вращающийся и регулировка его вычисленной высоты при необходимости). Пусть n
быть таким элементом. O (log n) , левый
. Давайте R
быть таким узлом. O (log n) Замените этот узел новым узлом со значением N, а поддерев слева
и R
. O (1)
По конструкции новый узел AVL-сбалансированный, а его поддерево 1 выше R
.
увеличивать баланс своего родителя соответственно. O (1)
Я подозреваю, что вам просто придется пройти одно дерево (надеюсь, чем меньше) и индивидуально добавляют каждое из его элементов на другое дерево. Операции AVL INSERT / DELETE не предназначены для обработки добавления целого поддерева одновременно.