Помощь - Поиск - Пользователи - Календарь
Полная версия: Вершины бинарного дерева.
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
TheKnyazz
Добрый день! Нужна небольшая помощь. Задача имеет такое условие: По уровнево распечатать вершины бинарного дерева снизу вверх. Слабо понимаю как надо это сделать. Понимаю, что надо подсчитать количество вершин, потом создать две рекурсии одна будет в цикле начиная с последнего увронвя вершин посылать переменную в другую функцию которая будет идитить, пока не достигнет переданного значения, когда достигнет, должна распечатать, и так каждый раз, пока не дойдет до начала. Но как это реализовать, не могу понять. У меня даже полноценный подсчет вершин почему-то очень криво получается...
вот моя горе-программа, был бы рад, если б кто-нибудь обьяснил...

Program derevo;
Uses Crt;

Type inform = Integer;
ss = ^zveno;
zveno = Record
key: Integer;
inf: Inform;
left, right: ss;
End;

Var t:ss;
n,nn,c,i,k: Integer;

Procedure Search(tt:ss; var k:integer);
begin
if (tt^.right<>nil) and (tt^.left<> nil) then
Begin
search(tt^.right,k);
k:=k+1;
search(tt^.left,k);
End
else
if (tt^.right<>nil) or (tt^.left<>nil) then
begin

k:=k+1;
if tt^.right<> nil then search(tt^.right,k);
if tt^.left<>nil then search(tt^.left,k);
end;
end;


Procedure Vstavka (Var p: ss; x: Integer);
Begin
If p = Nil Then
Begin
New (p);
p^.inf:=x;
p^.key:=1;
p^.left:=Nil;
p^.right:=Nil;
End;
If x<p^.inf Then Begin Vstavka (p^.left,x); End;
If x>p^.inf Then Begin Vstavka (p^.right,x); End;
End;



Procedure Print (Var p: ss; h: Integer);
Var i: Integer;
Begin
If p <> Nil Then
Begin
Print(p^.right,h+4);
For i:=1 To h Do Write (' ');
Writeln (p^.inf);
Print (p^.left,h+4);
End;
End;

Begin

Writeln ('Vvedite koli4estvo klju4ej: ');
Readln (n);
For i:=1 To n Do
Begin
Read ©;
Vstavka (t,c);
End;
Print (t,c);
k:=0;
Search(t,k);
writeln(k);
Readln;
readln;
End.


volvo
Я ж вроде тебе на одном из форумов уже показывал... Или это был не ты?

Было предложено решение:
function GetHeight(tree: ttree): integer;
function max(a, b: integer): integer;
begin
if a > b then max := a else max := b;
end;
var
leftHeight, rightHeight: integer;
begin
if tree^.left = nil then leftHeight := 0
else leftHeight := GetHeight(tree^.left);
if tree^.right = nil then rightHeight := 0
else rightHeight := GetHeight(tree^.right);
GetHeight := 1 + max(leftHeight, rightHeight)
end;
procedure PrintLevel(level: integer; root: ttree;
const to_print: integer);
begin
if (root = nil) or (level > to_print) then exit;
if level = to_print then write(root^.value, #32)
else begin
printlevel(level + 1, root^.right, to_print);
printlevel(level + 1, root^.left, to_print);
end;
end;
, вызывать:
  for i := GetHeight(mytree) downto 0 do PrintLevel(0, mytree, i);
Так пойдет?
TheKnyazz
Большое спасибо) Вы обьясняли точно не мне) я 2-й раз обычно не спрашиваю) Я искал примеры, но почему-то не смог найти) Я думал, что здесь нужно было больше изощрятся...а оказалось все гораздо проще...Еще раз большое спасибо!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.