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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.04.2009, 22:47   #1
Chudo4258
Форумчанин
 
Аватар для Chudo4258
 
Регистрация: 19.02.2009
Сообщений: 622
По умолчанию Деревья

Вывести на экран элемент из самого левого листа непустого дерева (лист - вершина, из которой не выходит ни одной ветки)

Код:
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

TYPE BT=integer;
     U = ^BinTree;
     BinTree = Record
         Inf : BT;
         L,R : U;
END;

PROCEDURE Ins(Var Tree : U; X : BT);      //вставляет элемент в дерево
Begin
   If Tree = Nil
   Then Begin 
	    New(Tree);
	    Tree^.L := Nil;
	    Tree^.R := Nil;
	    Tree^.Inf := x
	End
   Else If x < Tree^.inf
	Then Ins(Tree^.L, x)
	Else Ins(Tree^.R, x)
END;


PROCEDURE PrintTree(T:U);
Begin
 if T<>nil then
             begin
              PrintTree(T^.L);
              Writeln('  ', T^.inf:5);
              PrintTree(T^.R);
             end;
END;


PROCEDURE InsDer(var T:U); //формирование дерева
var i,n:integer;
    x:BT;
Begin
  Randomize;
  Write('kol-vo el-tov v dereve: ');
  readln(n);
  for i:=1 to n do
  begin
    x:=-10+Random(21); write(x:5,'   ');
    Ins(T,x);
  end;
END;

var Der:U;
    S:BT;
    i:integer;

BEGIN
  { TODO -oUser -cConsole Main : Insert code here }
  InsDer(Der);
  writeln;
  PrintTree(Der);


  while der^.L<>nil do
    der:=der^.L; //НО ЭТО НЕПРАВИЛЬНО

  writeln(der^.Inf);

  readln;
END.
Жми на весы!!!
Chudo4258 вне форума Ответить с цитированием
Старый 28.04.2009, 23:47   #2
Chudo4258
Форумчанин
 
Аватар для Chudo4258
 
Регистрация: 19.02.2009
Сообщений: 622
По умолчанию

Подскажите хотя бы идею.
Сделал еще вот так:

Код:
while der<>nil do
    if der^.L<>nil then der:=der^.L
                   else if der^.R<>nil then der:=der^.R
                                       else writeln(der^.Inf); der:=nil;
но тоже ничего не получается.

Цитата:
Рекурсию желательно не использовать, но на "худой момент" можно и с рекурсией.
Подскажите верно так будет или нет, а то при моих тестах результат вроде бы правильный, а что преподу взбредет в голову не знаю.

Код:
program Project2;
{$APPTYPE CONSOLE}
uses
  SysUtils;

TYPE BT=integer;
     U = ^BinTree;
     BinTree = Record
         Inf : BT;
         L,R : U;
END;

PROCEDURE Ins(Var Tree : U; X : BT);      //вставляет элемент в дерево
Begin
   If Tree = Nil
   Then Begin 
	    New(Tree);
	    Tree^.L := Nil;
	    Tree^.R := Nil;
	    Tree^.Inf := x
	End
   Else If x < Tree^.inf
	Then Ins(Tree^.L, x)
	Else Ins(Tree^.R, x)
END;


PROCEDURE PrintTree(T:U);
Begin
 if T<>nil then
             begin
              PrintTree(T^.L);
              Writeln('  ', T^.inf:5);
              PrintTree(T^.R);
             end;
END;


PROCEDURE InsDer(var T:U);
var i,n:integer;
    x:BT;
Begin
  Randomize;
  Write('kol-vo el-tov v dereve: ');
  readln(n);
  for i:=1 to n do
  begin
    Write('El: '); Readln(x);
    //x:=-10+Random(21); write(x:5,'   ');
    Ins(T,x);
  end;
END;

PROCEDURE I(var der:U);
var vsp:U;
begin
  while true do
   begin
    if der^.L<>nil then begin vsp:=der; der:=der^.L; end;
    if (der^.L=nil)and(der^.R<>nil) then begin vsp:=der; der:=der^.R; end;
    if (der^.L=nil)and(der^.R=nil) then exit;
   end;
end;

var Der,vsp:U;
    e:BT;

BEGIN
  { TODO -oUser -cConsole Main : Insert code here }
  InsDer(Der);
  writeln;
  PrintTree(Der);
  I(der);
  writeln(der^.Inf);
  readln;
END.
Жми на весы!!!

Последний раз редактировалось Stilet; 29.04.2009 в 08:23.
Chudo4258 вне форума Ответить с цитированием
Старый 29.04.2009, 08:39   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я не очень люблю кучи...
Твое "дерево" я правильно понимаю что это односвязный список?
Просто поэлементно пройтись?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.04.2009, 14:46   #4
Chudo4258
Форумчанин
 
Аватар для Chudo4258
 
Регистрация: 19.02.2009
Сообщений: 622
По умолчанию

Цитата:
Твое "дерево" я правильно понимаю что это односвязный список?
Просто поэлементно пройтись?
Почему односвязный список, если:
Код:
TYPE BT=integer;
     U = ^BinTree;
     BinTree = Record
         Inf : BT;
         L,R : U;
END;
Жми на весы!!!
Chudo4258 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Бинарные деревья Марсель059 Общие вопросы C/C++ 3 20.05.2009 21:47
деревья ShenDy Общие вопросы C/C++ 0 13.03.2009 19:18
Деревья Марат707 Microsoft Office Word 1 07.12.2008 14:24
Деревья Mitron Общие вопросы Delphi 5 01.02.2008 10:09
Деревья Зёка_студент Помощь студентам 1 26.12.2007 21:47