Обсуждение участницы:Анна
Версия от 20:07, 17 мая 2015; Анна (обсуждение | вклад) (→Алгоритм разделения АВЛ-дерева на два, где в первом дереве все ключи меньше заданного x, а во втором - больше)
Алгоритм разделения АВЛ-дерева на два, где в первом дереве все ключи меньше заданного x, а во втором - больше
Пусть у нас есть дерево
. Мы должны разбить его на два дерева и такие, что и .Предположим, что корень нашего дерева
, в таком случае все левое поддерево вместе с корнем после разделения отойдет в дерево . Тогда рекурсивно спускаемся в правое поддерево и там проверяем это условие (так как часть правого поддерева тоже может содержать ключи ). Если же корень оказался , то мы спускаемся той же рекурсией, но только в левое поддерево и ищем там.Пусть мы пришли в поддерево, корень которого
. В таком случае этот корень с левым поддеревом должен отойти в дерево .Поэтому мы делаем следующее: удаляем корень, запоминая его значение. Таким образом мы имеем сбалансированное АВЛ-дерево (бывшее левое поддерево). Делаем новую вершину со значением бывшего корня правым листом самого правого листа и запускаем балансировку. Обозначим полученное дерево за .Если это было первое поддерево, у которого корень был , то больше мы ничего не делаем, это и есть . Иначе нам нужно объединить его с уже построенным . Для этого мы ищем в дереве самое правое поддерево высоты, равной высоте .