Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

сиаод / 1-34 / 23.Двоичное дерево поиска. Свойства. Основные операции

..pdf
Скачиваний:
73
Добавлен:
11.05.2015
Размер:
217.4 Кб
Скачать

23.Двоичное дерево поиска. Свойства. Основные операции.

Двоичное дерево поиска – это двоичное дерево, с каждым из внутренних узлов которого, связан ключ, удовлетворяющий условиям:

1.Все ключи в левом поддереве меньше родительского узла меньше родительского

2.Все ключи в правом поддереве больше родительского

Для поиска среди N элементов может потребоваться не более log2N сравнений. Если дерево идеально сбалансировано.

В этом преимущество дерева перед линейным списком, в котором для поиска может потребоваться N сравнений Основные операции:

1.Включить узел в бинарное дерево поиска

2.Удалить узел

3.Выполнить поиск данных

4.Выполнить обход

5.Определить, пусто ли дерево

6.Создать

7.Уничтожить

Tree_Search(T,K).

1.i f (t=nil) or (k=T^.key) then return T

2.i f k<T^.key then return Tree_Search(T^.left,k)

3. else return Tree_Search(T^.right,k)

Iterative_Tree_Search(T,K).

1.while (T<>nil) and (k<>T^.key) do

2.if k<T^.key then TT^.left

3.else TT^.right;

returnT.

Min and Max.

Мин. Ключ в дереве поиска можно найти по указателю left от корня, пока знзачение очередного указателя не станет = 0.

Tree_Minimum(T).

1.while T^.left<>nil do TT^.left 2.return T.

Для макс. Нужно заменить в алг-ме Tree_Minimum(T) left на right.

Добавление и удаление эл-та.

Эти операции сохраняют свойство упорядоченности.

Tree_Insert(T,z).

1.if T=nil then new(T)

2.T^.keyz T^.leftnil T^.rightnil 3.else if z<T^.key then Tree_Insert(T^.left,z) 4.else Tree_Insert(T^.right)

5.return T.

Затраты операций пропорциональны высоте дерева. Удаление: возможны 3 случая.

1.удаляемая вершина не имеет сыновей.

2.удаляемая вершина имеет 1-ого сына.

3.вершина имеет 2-х сыновей.

Delete(T,k).

1.if T<> nil then if k<T^.key then Delete(T^.left,k) 2.else if k>T^.key then Delete(T^.right,k)

3.else если узел не имеет сыновей:

4.if (T^left=nil) and (T^.right=nil) then q:=T;T:=nil; Dispose(q). 5.else если узел имеет сыновей:

6.else if (T^.left=nil) then q:=T; T:=T^.right; Dispose(q). 7.else (if T^.right=nil) then q:=T; T:=T^.left; Dispose(q). 8.else Del(T^.right,T).

Del(T,q), T-ук-ль на корень дерева, q-ук-ль на замен-ю вершину.

1.if T^.left=nil then q^.keyT^.key; q1T TT^.right 2.Dispose(q1); return

3.else Del(T^.left, q).