Конкатенация/Слияние/Присоединение два дерева AVL

Предположите, что у меня есть два дерева AVL и что каждый элемент от первого дерева меньше тогда любой элемент от второго дерева. Что самый эффективный путь состоит в том, чтобы связать их в одно единственное дерево AVL? Я искал везде, но ничто не нашел полезным.

28
задан liviucmg 10 January 2010 в 14:06
поделиться

2 ответа

Предполагая, что вы можете уничтожить входные деревья:

  1. Удалите самый правый элемент для левого дерева и используйте его для построения Новый корневой узел, чей левый ребенок - это левое дерево, и чей правый ребенок - это правильное дерево: o (log n)
  2. определите и установите этот коэффициент баланса узла: O (log n). В (временном) нарушении инварианта фактор баланса может быть за пределами диапазона {-1, 0, 1}
  3. вращается, чтобы получить коэффициент баланса в диапазоне: o (log n) вращения: o (log n)

Таким образом, вся операция может быть выполнена в O (log n).

Редактировать: на второй мысль легче рассуждать о вращении в следующем алгоритме. Это также довольно быстрее:

  1. определяют высоту обоих деревьев: O (log n).
    Предполагая, что правильное дерево выше (другой случай - симметричный):
  2. Удалить крайний элемент из левого дерева (вращающийся и регулировка его вычисленной высоты при необходимости). Пусть n быть таким элементом. O (log n)
  3. в правом дереве, навигация налево, пока не достигнете узла, поддерева которого находится не более одного 1 выше , левый . Давайте R быть таким узлом. O (log n)
  4. Замените этот узел новым узлом со значением N, а поддерев слева и R . O (1)
    По конструкции новый узел AVL-сбалансированный, а его поддерево 1 выше R .

  5. увеличивать баланс своего родителя соответственно. O (1)

  6. и ребакантность, как вы, после вставки. O (log n)
31
ответ дан 28 November 2019 в 03:30
поделиться

Я подозреваю, что вам просто придется пройти одно дерево (надеюсь, чем меньше) и индивидуально добавляют каждое из его элементов на другое дерево. Операции AVL INSERT / DELETE не предназначены для обработки добавления целого поддерева одновременно.

1
ответ дан 28 November 2019 в 03:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: