Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.05.2010, 23:13   #1
DmuS
Пользователь
 
Регистрация: 14.11.2009
Сообщений: 12
По умолчанию деревья, дельфи

Привет всем. Помогите пожалуйста с задачей. Необходимо определить кол-во листьев в дереве, на заданном уровне. С рекурсией знаком не так давно Я пытался сделать через обход, вот что у меня получилось: x - уровень дерева, k - кол-во листьев
Код:
procedure preorder(t:PNode; var k:integer; x:integer);
begin
  if t<> nil then
    begin
      inc(i);
      if (i=x) and (t^.left=nil) and (t^.right=nil) then
        begin
        inc(k);
      dec(i);
      exit;
      end;
      preorder(t^.left);
      preorder(t^.right);
    end;
end;
Конечно же это результатов не принесло Помогите пожалуйста додуматься до правильного алгоритма
DmuS вне форума Ответить с цитированием
Старый 25.05.2010, 23:44   #2
sabbathist
Пользователь
 
Регистрация: 23.07.2009
Сообщений: 66
По умолчанию

Код:
function preorder(t:PNode; x:integer): integer;
var v1,v2: integer;
begin
      if (i=x) 
        exit(1);
     v1:=0; v2:=0;
     if (t^.left<>nil) then v1:= preorder(t^.left,x+1);
     if (t^.right<>nil) then v2:=preorder(t^.right,x+1);
    exit(v1+v2);
end;
где i-требуемый уровень х - текущий. негрубые баги допустимы. писал в этом окне.
O(n)

Последний раз редактировалось sabbathist; 25.05.2010 в 23:53.
sabbathist вне форума Ответить с цитированием
Старый 26.05.2010, 11:44   #3
DmuS
Пользователь
 
Регистрация: 14.11.2009
Сообщений: 12
По умолчанию

Большое спасибо, разобрался. Только написал через процедуру.
Код:
procedure TForm3.N17Click(Sender: TObject);
 var i,k,fl:integer;

procedure preorder(t:PNode; x:integer);
var v1,v2: integer;
begin
  if (i=x) then
    begin
      if (t^.left=nil) and (t^.right=nil) then
      inc(k);
      exit;
    end;
  if (t^.left<>nil) then preorder(t^.left,x+1);
  if (t^.right<>nil) then preorder(t^.right,x+1);
  exit;
end;


begin
  i:=StrToInt(InputBox('Ââåäèòå óðîâåíü','Óðîâåíü',''));
  k:=0; preorder(root,0);
  fl:=MessageDlg('Êîë-âî ëèñòüåâ ðàâíî '+IntToStr(k),mtInformation,[mbOk],0);
end;
Все работает! Еще раз спасибо!
DmuS вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Б - деревья Mclaren Помощь студентам 1 05.06.2010 13:40
Деревья на С++ osichev Помощь студентам 0 11.12.2009 21:51
деревья в С++ osichev Помощь студентам 0 10.12.2009 19:48
Деревья Mitron Общие вопросы Delphi 5 01.02.2008 10:09
Деревья Зёка_студент Помощь студентам 1 26.12.2007 21:47