Помощь - Поиск - Пользователи - Календарь
Полная версия: Вершины дерева. Заданный уровень.
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
MRK
Прошу помощи. Написал программу, которая выводит все вершины дерева на заданном уровне. Но еще требуется подсчитать количество этих вершин. Пытался менять процедуру printlevel (добавлял счётчик и т.п), но ничего не выходит так как она рекурсивная. Как её
MRK
Вот прога
Код
program derevya;
uses crt;
type tinf=integer;
     ptree = ^ttree;
     ttree = record
             inf:tinf;
             left, right: ptree;
             end;
{-----------------------------------------------}
function btree(m:word):ptree;
var nl,nr:word; k:tinf; node:ptree; left, right: ptree;
begin if m=0 then btree:=nil
      else begin
             nl:=m div 2;
             nr:=m-nl-1;
             writeln;
             writeln('Vvedite zna4enie');
             readln(k);
             new(node);
             node^.inf:=k;
             node^.left:=btree(nl);
             node^.right:=btree(nr);
             btree:=node
           end;
end;
{-----------------------------------------------}
procedure printlevel(root:ptree;level,curlevel:integer);
begin
    if (root<>NIL) then
      begin
        if (curlevel=level) then write(root^.inf,' | ')
        else
          begin
            printlevel(root^.left,level,curlevel+1);
            printlevel(root^.right,level,curlevel+1);
          end;
      end;
end;
{-------------------------------------------------------------------}
procedure print_tree(p:ptree; level:integer);
var i:integer;
begin
   if p=nil then exit;
   with p^ do
     begin
       print_tree(right,level+1);
       for i:=1 to level do write('   ');
       writeln(inf);
       print_tree(left,level+1);
     end
end;
{-------------------------------------------------------------------}
var m:word; root,p:ptree; level,k,n,current:integer; otvet:char;
begin
textmode(3);
textbackground(1);
repeat
clrscr;
writeln('Zadayte 4islo vershin');
readln(m);
root:=btree(m);
writeln;
writeln('Vvedennoe derevo:');
writeln;
print_tree(root,0);
writeln;
write('Vvedite nomer urovnya dlya pokaza');
writeln;
readln(level);
writeln('Vse vershini na urovne ',level,' : ');
printlevel(root,level,0);
writeln;
writeln('Dlya vihoda nazhmite "y"');
otvet:=readkey;
until otvet='y';
end.
volvo
Цитата
Пытался менять процедуру printlevel (добавлял счётчик и т.п), но ничего не выходит так как она рекурсивная

Ну, и что? В рекурсивной процедуре нельзя менять значение глобального счетчика? blink.gif
var
counter: integer;
{-----------------------------------------------}
procedure printlevel(root:ptree;level,curlevel:integer);
begin
if (root<>NIL) then
begin
if (curlevel=level) then begin
write(root^.inf,' | '); inc(counter);
end
else
begin
printlevel(root^.left,level,curlevel+1);
printlevel(root^.right,level,curlevel+1);
end;
end;
end;

begin { main }
...
write('Vvedite nomer urovnya dlya pokaza');
writeln;
readln(level);
writeln('Vse vershini na urovne ',level,' : ');
counter := 0; printlevel(root,level,0);
writeln('amount = ', counter);
writeln;
...
end.
MRK
Спасибо, я и не думал что всё так просто. good.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.