
- •Линейные списки
- •Стеки, очереди, деки
- •Представление стека в непрерывной памяти (в виде массива)
- •Представление стека в связанной памяти (в виде односвязного списка)
- •Очереди
- •Представление очереди в непрерывной памяти (в виде массива)
- •Представление очереди в связанной памяти (в виде односвязного списка)
- •Оценка затрат на поиск элемента
- •Деревья
- •Бинарные деревья
- •Сбалансированные и идеально сбалансированные деревья. Деревья поиска
Бинарные деревья
Бинарное (двоичное) дерево
Упорядоченноедерево, которое либо пусто, либо содержит корень и два поддерева.
Рис. 3. Пример двоичного дерева
ОПИСАНИЕ УЗЛА ДВОИЧНОГО ДЕРЕВА
Type
TREE=^NODE;
NODE=record
KEY:char;
LEFT,RIGHT:tree;
End;
Рис. 4. Узел двоичного дерева
ПРИМЕРЫ ОПЕРАЦИЙ НАД ДЕРЕВЬЯМИ
Обход дерева в соответствии с установленным правилом.
Создание дерева с заданными свойствами.
Удаление дерева.
Включение/исключение узла с заданным значением.
Выполнение эквивалентных преобразований дерева.
ОБХОД БИНАРНОГО ДЕРЕВА
Цель обхода - "посещение" всех узлов дерева. В зависимости от порядка перечисления узлов дерева (алгоритма обхода) различают следующие основные виды обхода деревьев(Корень - rooT,Левое - Left,Правое - Right):
Сверху вниз(КЛП,TLR,-обход, префиксная запись)
Слева направо(ЛКП,LTR,-обход, инфиксная запись)
Снизу вверх(ЛПК,LRT,-обход, постфиксная запись)
* Левое и правое поддеревья (L, R) – тоже деревья, поэтому их узлы посещаются в соответствии с выбранным обходом (рекурсия).
Лучше остановиться на этих трех обходах (см. Н. Вирт, стр.244), попытки добавить 3 оставшихся возможных обхода (КПЛ, ПКЛ, ПЛК) - лишняя трата времени.
-
Рис. 5. Примеры обхода бинарных деревьев
ДЕРЕВО А:
КЛП: РТСТУКРУА
ЛКП: СТРУКТУРА
ЛПК: СТКУУАРТР
ДЕРЕВО B:
КЛП: 435790
ЛКП: 537490
ЛПК: 573094
ПРИМЕР 1. ПРОЦЕДУРЫ ОБХОДА ДЕРЕВЬЕВ
{КЛП} Procedure preorder(t:tree); Begin If t<>nil then begin P(t); Preorder(t^.left); Preorder(t^.right); end; end;
|
{ЛКП} Procedure inorder(t:tree); Begin if t<>nil then begin inorder(t^.left); P(t); Inorder(t^.right); End; End;
|
{ЛПК} Procedure postorder(t:tree); Begin if t<>nil then begin postorder(t^.left); postorder(t^.right); P(t); End; end; |
P(t)- вывод значения узла t и/или другие операции с текущим узлом дерева.
|
ПРИМЕЧАНИЕ. См. также программу Treeobhod.exe (каталог \Программы\01_Обход) - пример трех обходов создаваемых деревьев.
a) высоту (____________) b) длину пути (____________) c) листья (____________) d) внутренние узлы (____________)
Обойдите это дерево с помощью трех известных алгоритмов КЛП:__________________________ ЛКП:__________________________ ЛПК:__________________________
|
ПРИМЕР 2. По заданным двум обходам нарисовать диаграмму исходного дерева:КЛП: АПЕЛРЬ ЛКП: АЕЛПРЬ
При обходах КЛП и ЛПК однозначно восстановить исходное дерево не получится - ПОЧЕМУ?
РЕШЕНИЕ:
КЛП: Ищем корень дерева:АПЕЛРЬ
ЛКП:Ищем ключА, выделяем поддеревья:(-)ЛАК(ЕЛПРЬ)П; левое поддерево пустое.
КЛП: Ищем корень правого поддерева для вершиныА:ПЕЛРЬ
ЛКП:Ищем ключП:(ЕЛ)Л ПК(РЬ)П.
Левое поддерево для П: КЛП-ЕЛ,ЛКП-ЕЛ.
Корень – Е,Л-в правом поддереве.
Правое поддерево для П: КЛП-РЬ,ЛКП-РЬ
Корень – Р,Ь-в правом поддереве.
Результат выполненных действий см. на рис. 8.