Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
algoritmy.docx
Скачиваний:
15
Добавлен:
27.09.2019
Размер:
237.74 Кб
Скачать

11. Обходы бинарных деревьев (клп - "Корень-Левое-Правое" ,лкп,лпк) с примерами программной реализации.

1. Обход бинарного дерева в прямом порядке:

а) Обработать корень (например, вывести в выходную последовательность его имя);

b) Обойти левое поддерево корня в прямом порядке;

c) Обойти правое поддерево корня в прямом порядке.

Обход приведённого бинарного дерева в прямом порядке даст: ABCDEFGH.

2. Обход бинарного дерева в обратном порядке:

a) Обойти левое поддерево корня в обратном порядке;

b) Обработать корень;

c) Обойти правое поддерево корня в обратном порядке.

Обход приведённого бинарного дерева в обратном порядке даст: CBEDAGFH.

3. Обход в бинарного дерева в концевом порядке:

а) Обойти левое поддерево корня в концевом порядке;

b) Обойти правое поддерево корня в концевом порядке.

c) Обработать корень;

Обход приведённого бинарного дерева в концевом порядке даст: CEDBGHFA.

Следует обратить внимание на то, что при обходе бинарного дерева в прямом порядке, любая его вершина , рассматриваемая как корень, посещается перед обходом поддеревьев этого корня, а при концевом порядке – после.

В случае же обратного обхода бинарного дерева, корень любого его поддерева (и самого этого дерева в целом) посещается непосредственно после обхода левого поддерева и перед обходом правого поддерева этого корня.

Помимо указанных трёх основных порядков обхода, на практике иногда применяется ещё один – поуровневый обход (обход вширину) бинарного дерева, при котором вершины бинарного дерева начиная с корня перечисляются последовательно слева направо, уровень за уровнем.

Для нашего примера указанный порядок обхода даст последовательность: ABFCDGHE.

Необходимые для программной обработки бинарных деревьев операции их ввода-вывода, требуют возможности строчного представления бинарных деревьев в форме последовательности знаков.

Одним из простых способов такого представления является скобочная запись бинарных деревьев, суть которой ясна из следующей кодировки бинарного дерева рис.1:

( ( (*С*) B ( (*E*)D* ) ) A ( (*G*)F(*H*) ) )

В приведённой выше записи, знаком '*’ обозначены пустые поддеревья, и для лучшей читабельности, добавлены лишние пробелы.

12. Удаление элемента из бинарного дерева поиска.

Удаление элемента из множества.

Удаление – несколько более сложная процедура, чем вставка. Пусть нам надо удалить элемент x. Найдём узел r, который его содержит. Если такого узла найти не удалось, то и делать ничего не надо.

Если у узла r нет сыновей, то всё хорошо: уничтожаем узел и пишем NIL в указатель, который на него ссылался.

Если у узла только один сын, то тоже всё понятно: уничтожаем узел, а в указатель, который на него ссылался, заносим адрес сына.

Наконец, что делать, если у удаляемого узла r два сына? В этом случае нам надо найти в его правом поддереве узел с самым маленьким элементом. Это несложно: берём правого сына и идём от него влево, пока не найдём узел q, у которого левого сына нет. Он и будет искомым. Теперь значение из q запишем в узел r, а удалять будем уже не r, а q. Как это делается, см. выше.

Приведём пример реализации (для удобства он сделан в виде рекурсивной процедуры. Для экономии места в стеке внутренняя рекурсивная процедура вложена во внешнюю и пользуется её параметром x и локальными переменными):

procedure del(var root: PNode; x: Integer);

var

p,q: PNode;

procedure del_rec(var r: PNode);

begin

if r=NIL then exit;

if x<r^.v then begin del_rec(r^.left); exit; end;

if x>r^.v then begin del_rec(r^.right); exit; end;

if (r^.left=NIL) or (r^.right=NIL) then

begin

p:=r;

if r^.left=NIL then r:=r^.right else r:=r^.left;

dispose(p);

exit;

end;

p:=r^.right;

if p^.left=nil then

begin

r^.v:=p^.v;

r^.right:=p^.right;

dispose(p);

exit;

end;

//идём влево, пока есть куда

q:=p^.left;

while q^.left<>NIL do begin

p:=q; q:=q^.left;

end;

//значение из q^ кинем в r^, и удалять будем уже не r^, а q^

r^.v:=q^.v;

p^.left:=q^.right;

dispose(q);

end;

begin

del_rec(root);

end;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]