Слияние двух деревьев

Для двух сбалансированных деревьев поиска T1 и T2 таких, что все элементы в T1  меньше или равны всех элементов в T2 : слияние деревьев в одно дерево поиска T.

Выбираем из дерева T2 наименьший элемент v (самый левый) и удаляем его из дерева T2  . Элемент v  называется стыковочным. Для него верно: T1£ v£ T2 .

Возможна ситуация, когда стыковочный элемент присутствует уже в постановке задачи.

Будем, для определенности, предполагать, что высота дерева T1 больше или равна высоте дерева T2.

Рассмотрим правую ветвь дерева T1 : {v1,…,vK}. В силу сбалансированности дерева имеем: h(vi) - h(vi+1)  £ 2, тогда на этой ветви найдется вершина vl, такая что

h(vl) = h(T2)  или h(vl) = h(T2)+1

Сольем дерево с корнем в vl и  T2 с помощью стыковочной вершины v и подставим новое дерево на место старой вершины vl.

Вершина vl и все дерево, с нее начинающееся, окажутся сбалансированными. Высота же дерева, начинающегося с vl, увеличится на 1, т.к. h(T2) £h(vl) .

Итак, в результате изменений дерева у одной вершины w длина соответствующего поддерева увеличилась на 1. Далее нам следует запустить стандартную процедуру балансировки дерева. Мы должны пройти ветвь, заканчивающуюся на w, от w до корня и в каждой вершине проверить баланс. Если он будет по модулю больше 1, то баланс в данной вершине следует скорректировать одним или двумя вращениями.

Если, при этом, длина данного поддерева восстановится до значения, которому она была равна до слияния деревьев, то далее процесс проверки сбалансированности производить не надо (т.к. дерево T1 до слияния было сбалансированным). Иначе, процесс проверки следует продолжить.

Отметим, что, в отличии от добавления к дереву одной вершины, в данном случае после уравновешения одной вершины процесс может не завершиться, т.к. возможен следующий вариант

 

Этот вариант не мог реализоваться при добавлении одной вершины к дереву. В этом случае до слияния деревьев высота дерева с корнем a была равна h+1, а после слияния она стала равной h+2.

Итак, в силу построения алгоритма слияния двух  сбалансированных деревьев, верна

Теорема. Для двух сбалансированных деревьев поиска T1 и T2  , состоящих из N1 и N2 вершин, имеющих высоты h1 и h2,  и элемента v, таких, что все элементы в T1  меньше или равны v и v меньше или равно всех элементов в T2 : слияние деревьев с помощью стыковочного элемента v в одно сбалансированное дерево поиска T можно произвести за время T=O(log2 (N1+N2) ) или за время T=O(|h1-h2|). Указанные деревья T1 и T2 можно слить за время T=O(log2 (N1+N2) ).

 

Отметим здесь, что для слияния двух сбалансированных деревьев требуется сначала извлечения стыковочный элемент из дерева с большей высотой, поэтому эта операция требует большего времени, чем слияние деревьев с готовым стыковочным элементом.

 

 

Разбиение дерева по разбивающему элементу

Для данной вершины дерева v разбиение сбалансированного дерева поиска T на два сбалансированных дерева поиска T1 и T2 таких, что все элементы в T1  меньше или равны v, и все элементы в T2  больше или равны v.

Описание: Описание: Описание: Описание: Описание: Описание: Описание: Описание: Описание: Описание: Описание: Описание: Описание: p1

Алгоритм, практически полностью, совпадает с алгоритмом разбиения обычного дерева поиска. Только, теперь, нам следует пользоваться алгоритмом слияния деревьев для сбалансированных деревьев поиска.

Пусть высота дерева T0 равна s0. Пусть с деревом T0 будут последовательно сливаться деревья T с индексами i1,…,iK (iK£h), в результате чего будут получаться деревья S1, S2,…, SK . Будем считать S0= T0.  Т.е. Sj-1+ Tij ® Sj .

Высота дерева Sj равна либо MAX(h(Sj-1),h(Tij )), либо MAX(h(Sj-1),h(Tij ))+1.

Пусть Ri – деревья с корнями в вершинах vi. Высота дерева Ri равна либо h(Ti)+1 либо h(Ti)+2. h(Ri) строго возрастают.

Покажем по индукции , что высота дерева Sj равна либо h(Rij), либо h(Rij)-1, либо h(Rij)-2. Пусть данное свойство выполнено для l<j, тогда

h(Sj )=MAX(h(Sj-1),h(Tij )) | MAX(h(Sj-1),h(Tij ))+1 следовательно

h(Sj )= MAX(h(Sj-1),h(Rij) -1) | MAX(h(Sj-1),h(Rij) -2) |

MAX(h(Sj-1),h(Rij) -1)+1 | MAX(h(Sj-1),h(Rij) -2)+1 следовательно по индукции

h(Sj )= (h(Rij) -1) | ((h(Rij) -1) | h(Rij) -2) |

h(Rij)  |                 (h(Rij) | h(Rij) -1) следовательно

h(Sj )= h(Rij) | (h(Rij) -1) | (h(Rij) -2)

Здесь под вертикальной чертой подразумевается разделение возможных вариантов.

Время работы всего алгоритма

T=O(|h(T0)- h(Ti1 )|+1 +| h(S1)- h(Ti2 )|+1 +…+| h(SK-1) - h(TiK )|+1)=

=O(|h(T0)- h(Ti1 )| +| h(S1)- h(Ti2 )| +…+| h(SK-1) - h(TiK )|)+O(h)=

=O(|h(T0 )- h(Ri1 )|+4 +| h(Ri1 )- h(Ri2 )|+4 +…+| h(Ri(K-1) ) - h(RiK )|+4)+O(h)=

(в силу возрастания  h(Ri) )

=O(|h(T0 )- h(Ri1 )|+| h(Ri1 )- h(Ri2 )|+…+| h(Ri(K-1) ) - h(RiK )|)+O(h)= O(h)

 

Т.о.  T= O(h)=O(log2 N), где Nколичество вершин в суммарном дереве.

Итак, верна следующая

Теорема. Для данной вершины v сбалансированного дерева поиска T разбиение на два сбалансированных дерева поиска T1 и T2 таких, что все элементы в T1  меньше или равны v, и все элементы в T2  больше или равны v. может быть произведено указанным алгоритмом за время  = O(log2 N), где Nсуммарное количество вершин в деревьях T1 и T2.