
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).