проходження -------------} PrintDown (level: integer; root: pnode);
{в цьому обході заодно розрахуємо висоту дерева h для його подання}
if root = nil then
exit;
with root ^ do
begin
{для прошивки дерева встановлюємо прапорці}
if right = nil then
rf: = false;
lf: = false;
{визначаємо висоту дерева}
if (left = nil) and (right = nil) then
begin
j: = j +1;
if h
{висотою дерева є його максимальний шлях проходження}
h: = j;
j: = 0;
end;
writeln ('': 2 * level, v);
j: = j +1;
PrintDown (level +1, left);
PrintDown (level +1, right)
end;;
{--------------- Симетричний порядок проходження -------} PrintLex (level: integer; root: pnode);
if root = nil then
exit;
with root ^ do
begin
PrintLex (level +1, left);
writeln ('': 2 * level, v);
PrintLex (level +1, right);
end;
{----------- Кінцевий порядок проходження ----------} PrintUp (level: integer; root: pnode);
if root = nil then
exit;
with root ^ do
begin
PrintUp (level +1, left);
PrintUp (level +1, right);
writeln ('': 2 * level, v);
end;
{------------ прошивка ---------------------------- -} Threading (x: pnode); p: pnode;
stop: boolean;
{встановлюємо покажчик}
procedure rightPointer (y: pnode; i: integer);
begin
if stop = true then
exit;
j: = j +1; {підраховуємо число рекурсій}
if y = nil then
exit;
with y ^ do
begin
rightPointer (left, i);
if (j> i) and (rf = true) then
begin
j: = 0;
writeln ('Прошиваємо', x ^. v, 'елемент з', v);
x ^. right: = y;
{згортаємо рекурсію}
stop: = true;
{помічаємо, що вузол або аркуш прошитий}
x ^. lf: = true;
exit;
end;
if lf = true then
exit;
rightPointer (right, i);
end
end;
i: = i +1; {підраховуємо число рекурсій}
if x = nil then
exit;
with x ^ do
begin
rf: = true; {помічаємо, що вузол або аркуш відвідувався}
Threading (left);
if (rf = true) and (right = nil) then
{якщо сайт не прошитий}
begin
stop: = false;
{прошиваємо його}
rightPointer (root, i);
end;
if (left = nil) and (right = nil) then
{прошиваємо лист}
begin
stop: = false;
rightPointer (root, i);
end;
writeln ('', v);
if lf = true then {якщо вузол або аркуш прошитий}
exit; {виходимо}
Threading (right);
end;;
{------------- формування дерева ---------------} Cycle; i: = 1 to n do
Insert (root, m [i]);;
{----------------------------------------- -----------}
Cycle;
{визначимо висоту дерева обходом зверху-вниз}
PrintDown (1, root);
writeln ('Виберіть дію');
while true do
...