Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник_Часть_1.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
974.85 Кб
Скачать

14.4.4. Рекурсивные алгоритмы работы с двоичными деревьями

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

1. Посетить корень.

2. Посетить левое поддерево.

3. Посетить правое поддерево.

Обходя дерево по этому алгоритму, мы посетим узлы по алфавиту (рис.14.8).

Рис.14.8. Порядок обхода дерева

Проходя дерево по данному алгоритму, мы посетим вершины дерева в следующем порядке: A, B, C, D, E, F, G. Как изменить порядок пунктов алгоритма, чтобы пройти узлы в последовательности:

а) A, E, G, F, B, D, C; б) C, D, B, F, G, E, A; в) C, B, D, A, F, E, G

П р и м е р ы использования рекурсивных алгоритмов для работы с двоичными деревьями.

const k = 13;

a:array[1..k] of integer=(2,4,6,1,3,5,7,10,12,14,11,13,15);

type ptree=^ttree;

ttree = record

dat:integer;

l,r:ptree

end;

var

kor, t:ptree;

I, X : integer;

fl : boolean; {v - новый элемент}

procedure bild(v:ptree; var kor:ptree); {построение}

begin

if kor = nil

then begin

kor:=v;

v^.l := nil;

v^.r := nil

end

else if v^.dat<kor^.dat

then bild(v,kor^.l) {заполнение левой ветви}

else bild(v,kor^.r) {заполнение правой ветви}

end;

procedure prosm(t:ptree);{просмотр в порядке возрастания}

begin

if t^.l <> nil then prosm (t^.l);

writeln (t^.dat);

if t^.r<> nil then prosm (t^.r);

end;

procedure poisk(t:ptree); {линейный поиск в

begin неупорядоченном дереве}

writeln(' ',t^.dat);

if t^.dat=x

then writeln(' Нужный элемент найден !',t^.dat)

else begin

if t^.l <> nil

then poisk(t^.l);

if t^.r <> nil

then poisk(t^.r);

end;

end;

procedure dv_poisk(t:ptree); {двоичный поиск в

begin упорядоченном дереве}

write(' ',t^.dat);

if t^.dat = x

then begin

fl:=true;

writeln;

writeln('Нужный элемент найден!',t^.dat)

end

else if (x<t^.bat)and(t^.l<>nil)

then dv_poisk (t^.l)

else if t^.r<>nil

then dv_poisk(t^.r)

end;

{ ОСНОВНАЯ ПРОГРАММА }

begin

kor := nil;

for i:=l to k {строим упорядоченное дерево}

do begin

new(t);

t^.dat:=a[i];

build(t,kor);

end;

writeln('Просмотр дерева!');

prosm(kor);

{или writeln ('Обход дерева! ');

obch(kor);}

readln;

write(' Линейный поиск, введите х ');

readln(x);

poisk(kor);

writeln( 'Двоичный поиск: ');

fl:=false;

dv_poisk(kor);

if not fl

then writeln (' " Элемент не найден!');

readln

end.

Литература

  1. Методы программирования: Учеб. Пособие / Под ред. Г.А. Угольницкого. – М.: Вузовская книга, 1999. – 280 с.

  2. Фаронов В.В. Турбо Паскаль 7.0. Начальный курс: Учеб. пособие. –М.: Изд-во «Нолидж», 1997. – 616 с.

  3. Фаронов В.В. Турбо Паскаль 7.0. Практика программирования: Учеб. пособие. –М.: Изд-во «Нолидж», 1997. – 432 с.

  4. Марченко А.И., Марченко Л.А. Программирование в среде Turbo Pascal 7.0. –М.: Бином универсал, Киев: ЮНИОР, 1997. – 496 с.

  5. Гусева А.И. Учимся информатике: задачи и методы их решения. – М.: Изд-во «Диалог-МИФИ», 1999. – 320 с.

  6. Пильщиков В.Н. Сборник упражнений по языку Паскаль: Учеб. пособие для вузов. – М.: Наука. 1989. – 160 с.

Учебное издание

Козлов Георгий Валентинович

Смоляков Виктор Николаевич

Программирование на языке высокого уровня