Курсовая работа: Структури даних для обробки інформації
procedure write_tree(x:BinarTree);
begin
if (x^.left<>nil) or (x^.right<>nil) then
begin
if x^.left<>nil then write_tree(x^.left);
if x^.right<>nil then write_tree(x^.right);
end;
write(x^.data,' ');
end;
Тут виведення вузлів здійснюється як результат зворотньої дії рекурсивної процедури (вказівка write(x^.data,' ') – вкінці процедури). При такій організації вузли розпочнуть виводитись на екран після досягнення крайнього лівого листка.
При введенні бінарного дерева, зображеного на малюнку 4, результат роботи описаної процедури буде наступним:
Все узлы дерева: 0 2 1 4 5 3 7 9 8 6 11 13 12 15 18 20 19 17 16 14 10
Якщо вказівку write(x^.data,' ') розмістити не в кінці, а на початку процедури, то виведення вузлів буде здійснюватися як результат прямої дії рекурсії. Тобто, спочатку виведуться усі ліві потомки кореня дерева, потім правий потомок предка крайнього лівого листка і всі його ліві потомки і т.д. аж до крайнього правого лиска дерева.
В цьому випадку при введенні того ж дерева (мал.4) результат роботи такої процедури наступний:
Все узлы дерева: 10 6 3 1 0 2 5 4 8 7 9 14 12 11 13 16 15 17 19 18 20
ВИЗНАЧЕННЯ КІЛЬКОСТІ РІВНІВ БІНАРНОГО ДЕРЕВА (ВИСОТИ ДЕРЕВА)
На малюнку 5 зображено шести-рівневе бінарне дерево. Лівий потомок (6) – 4-х рівневе дерево. Правий потомок (16) 5-ти рівневе дерево. Бачимо, що для того, щоб визначити висоту дерева необхідно до висоти «вищого» потомка додати 1. Виходячи з таких міркування функція визначення висоти дерева (Function height_tree(x:BinarTree):integer) має рекурсивний характер.
Нехай i – висота лівого потомка, а j – висота правого потомка. Тоді:
Function height_tree(x:BinarTree):integer;
var
i,j:integer;
begin
if x=nil then height_tree:=0
else
begin
i:=height_tree(x^.left);
j:=height_tree(x^.right);
if i>j then height_tree:=i+1