Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2docx-1.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
2.27 Mб
Скачать

26. Сбалансир-е деревья. Алгоритм добавления узла в сбалансир-е дерево.

Df Дерево называется сбалансир-м, если для каждого узла в дереве два поддерева этого узла содержат приблизит.равное кол-во элементов. Df Дерево •пустое дерево •структурный терм вида (t, ), где имя, t произв. терм (узел дерева), мн-во поддер-в. Df Двоичное дерево •пуст.дер. •структур-ный терм вида (t, l, r), где имя, t - произвольный терм (узел дерева), l, r двоич-ные дер. – лев. и прав. поддер. Df (t, l, r) (x==t) (x ) (x ). Df Дер. T наз-ся AVL-деревом, если T= , либо T= (x, l, r), где –AVL-деревья, и |h(l)-h(r)| 1., где h – глубина, опред-я след. образом: h( =0 и h( (t, l, r)) = max(h(l),h(r))+1. Сбал-е деревья нужны для быстрого поиска, тк обычные деревья поиска могут не обладать всей привлекательностью дв-го поиска, напр. для отсортиров-й посл-ти дерево поиска будет выглядеть как список, и поиск O(n). В сбал-м дереве поиск имеет сл-ть O(log_2(n)). Доб-е узла в такое дерево связано с трудностями, тк может нарушаться сбал-ть и требоваться перестройка. Для реализации необх. сохранять информацию о сбал-ти дерева. Требуется знать разницу между высотами поддер-в, кот.м.б.равна -1,0,+1. Для упрощения операций желательно сопровождать инф-ю о полной высоте деревьев. Представим AVL-деревья в след. форме: t( Left, A, Right) /Height. Пустое дер.-nil/0. Рассм.операцию вставки эл-та X в непустое дер.. Tree=t(L,A,R)/H. Изучим тот вариант, в кот. X>А. После этого вставим X в дерево К и получим следующее отношение: addsvl(R, X, tl R1, В, R2) /Hb).Деревья L и R могут отличаться по высоте не больше чем на 1. Поскольку в дерево R вставлен только один элемент, X, то не более чем одно из поддеревьев (R1 пли R2) может иметь высоту h + 1. В том случае, если X меньше А, ситуация является аналогичной, за исключением того, что левое и правое поддеревья меняются местами. Поэтому в любом случае необх-мо сформировать новое дерево из трех деревьев (назовем их Treel, Tree2 и ТгееЗ) и двух отдельных элементов, А и В. Порядок компонентов в дереве NewTree слева направо должен быть следующим: Tree1, А, Тгее2, В, ТгееЗ. Необходимо рассмотреть следующие варианты. 1. Среднее дерево, Тгее2, является более высоким, чем оба других дерева. 2. Дерево Treel является, по меньшей мере, таким же высоким, как деревья Тгее2 и ТгееЗ. 3. Дерево ТгееЗ является, по меньшей мере, таким же высоким, как деревья Тгее2 и Treel. В варианте 1 среднее дерево (Тгее2) необходимо разделить на части и включить их в дерево NewTree.

% addavl( Tree, X, NewTree): вставка в AVL-словарь, Tree = t( Left, Root, Right)/KeightOfTree, Пустое дерево - nil/0

addavl( nil/0, X, t(nil/0,X,nil/0)/1). % Ввести элемент X в пустое дерево

addavl ( t (L, Y, Р.)/Ну, X, NewTree} :- % Ввести элемент Х в непустое дерево

gtl Y, X), addavl( L, X, t(Li,Z,L2)/_) , % Ввести элемент Х в левое поддерево

combine( LI, Z, L2, Y, R, NewTree).

addavl ( t(L,Y,R)/Hy, X, NewTree) :-

gt ( X, Y) , addavl( R, X, t(Rl,Z,R2)/_), % Ввести E правое поддерево

combine (L, Y, Rl, Z, R2, NewTree).

% combine( Treel, A, Tree2, В, ТгееЗ, NewTree):

% Объединить поддеревья Treel, Tree£, ТгееЗ и узлы А и В в AVL-дерево

conibine ( Tl/Hl, A, t(Т21ГВ,Т22) / Н2, С, ТЗ/НЗ, % Пять компонентов

t( t [Tl/Hl, A, T21) /Нд, В, t (Т22,С,ТЗ/НЗ)/Не)/НЬ) :- % Их сочетание

Н2 > HI, H2 > НЗ, % Среднее дерево - самое высокое

На is HI + 1, % Высота левого поддерева

Не is НЗ + l , % Высота правого поддерева

Hb is На + 1. % Высота всего дерева

combine ( Tl/Hl, A, T2/H2, С, ТЗ/НЗ,

t( Tl/Hl, A, t(Т2/Н2,С,ТЗ/НЗ)/Нс)/На ) :-

HI >= Н2, HI > = НЗ-, % Высокое левое поддерево

maxl( Н2, НЗ, Нc), maxl( HI, Hc, HaJ .

combine ( Tl/Hl, A, T2/H2, С, ТЗ/НЗ,

t( t(Tl/Hl,ft,Т2/Н2)/На, С, ТЗ/НЗ)/НС ) :-

НЗ >= Н2, H3 >= К1, maxl (HI, H2, На), maxl (На, НЗ, Не).

maxl (U, V, М) :- % М равно 1 + максимальное из двух значение, V и V

U > V,! , M i s U + 1; М i s V + 1,