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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.06.2013, 17:28   #1
PhoenixPC
 
Аватар для PhoenixPC
 
Регистрация: 01.06.2013
Сообщений: 6
Вопрос Работа с уровнями в дереве (Pascal)

Подпрограмма должна искать максимальное значение на уровне в дереве. Я с этой рекурсией часто путаюсь, вот и здесь что-то не так, а что - не знаю... Но проблема в том, что даже дерево построить не входит: всего один элемент вводится. Посмотрите, пожалуйста?

Код:
type tree=^elem;
        elem=record
            info,ur:integer;
            L,R:tree;
        end;

var t:tree; x,i,N:integer;

procedure Create(t:tree; x:integer; l:integer);
  begin if x<t^.info then
          if t^.L<>nil then Create(t^.L, x, l+1)
          else begin 
            new(t^.L);
            t^.L^.info:=x;
            t^.L^.L:=nil;
            t^.L^.R:=nil;
            t^.L^.ur:=l; end
        else if t^.R<>nil then Create(t^.R, x, l+1)
          else begin 
                     new(t^.R);
                     t^.R^.info:=x;
                     t^.R^.L:=nil;
                     t^.R^.R:=nil;
                     t^.R^.ur:=l; end;
  end;

procedure PMax(t:tree; N:integer);
  var max:integer;
  begin
    max:=t^.info;
    if t<>nil then begin
      if t^.ur=N then
        if t^.info>max then max:=t^.info else PMax(t^.R, N+1);
    end;
  writeln('max na urovne N=', max);
  end;

Begin new(t);
  t^.ur:=1;
  i:=1;
  while x<>0 do begin
    read(x);
    if x<>0 then Create(t, x, i);
  end;
  readln(N);
  PMax(t, N);
  readln;
End.
PhoenixPC вне форума Ответить с цитированием
Старый 02.06.2013, 23:20   #2
PhoenixPC
 
Аватар для PhoenixPC
 
Регистрация: 01.06.2013
Сообщений: 6
По умолчанию

Никто не знает?
PhoenixPC вне форума Ответить с цитированием
Старый 03.06.2013, 00:03   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,431
По умолчанию

Код:
type
  tree = ^elem;

  elem = record
    info, ur: integer;
    L, R: tree;
  end;

var
  k: tree;
  x, N: integer;

procedure add(var t: tree; x: integer; L: integer);
begin
  if t = nil then
  begin
    new(t);
    t^.info := x;
    t^.L := nil;
    t^.R := nil;
    t^.ur := L;
  end
  else if x < t^.info then
    add(t^.L, x, L + 1)
  else
    add(t^.R, x, L + 1);
end;

function max(a, b: integer): integer;
begin
  if a > b then
    max := a
  else
    max := b;
end;

function treemax(t: tree; N: integer): integer;
begin
  result := Low(integer);
  if N < 1 then
    exit;
  if t <> nil then
  begin
    if t^.ur = N then
      result := t^.info
    else
      result := max(treemax(t^.L, N), treemax(t^.R, N));
  end;
end;

procedure printtree(t: tree);
var
  i: integer;
begin
  if t <> nil then
  begin
    writeln(t^.info:t^.ur * 4);
    printtree(t^.L);
    printtree(t^.R);
  end;
end;

procedure deltree(var t: tree);
begin
  if t <> nil then
  begin
    deltree(t^.L);
    deltree(t^.R);
    dispose(t);
    t := nil;
  end;
end;

Begin
  k := nil;
  repeat
    read(x);
    if x <> 0 then
      add(k, x, 1);
  until x = 0;
  printtree(k);
  readln(N);
  writeln(treemax(k, N));
  deltree(k);
  readln;
End.
Проверьте.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 03.06.2013 в 00:38.
BDA вне форума Ответить с цитированием
Старый 03.06.2013, 01:17   #4
PhoenixPC
 
Аватар для PhoenixPC
 
Регистрация: 01.06.2013
Сообщений: 6
По умолчанию

BDA
Спасибо большое! Кое-что исправила - и все заработало!
PhoenixPC вне форума Ответить с цитированием
Старый 03.06.2013, 01:28   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,431
По умолчанию

Пожалуйста.
Может быть напишите исправленный вариант (так сказать, для будущих поколений)? Да и мне тоже интересно, что пришлось изменить - тестировал в дельфи, так как паскаля нет под рукой.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 03.06.2013, 01:36   #6
PhoenixPC
 
Аватар для PhoenixPC
 
Регистрация: 01.06.2013
Сообщений: 6
По умолчанию

Конечно. Вот исправленный код: (делала в Турбо Паскале)
Код:
type
  tree = ^elem;
  elem = record
    info, ur: integer;
    L, R: tree;
  end;

var
  k: tree;
  x, N: integer;

procedure add(var t: tree; x: integer; L: integer);
begin
  if t = nil then
  begin
    new(t);
    t^.info := x;
    t^.L := nil;
    t^.R := nil;
    t^.ur := L;
  end
  else if x < t^.info then
    add(t^.L, x, L + 1)
  else
    add(t^.R, x, L + 1);
end;

function max(a, b: integer): integer;
begin
  if a >= b then
    max := a
  else
    max := b;
end;

function treemax(t: tree; N: integer): integer;
var result: integer;
begin
  result := -maxint;
  if t <> nil then
  begin
    if t^.ur = N then
      result := t^.info
    else
      result := max(treemax(t^.L, N), treemax(t^.R, N));
  end;
  treemax := result;
end;

procedure printtree(t: tree);
var
  i: integer;
begin
  if t <> nil then
  begin
    writeln(t^.info:t^.ur * 4);
    printtree(t^.L);
    printtree(t^.R);
  end;
end;

procedure deltree(var t: tree);
begin
  if t <> nil then
  begin
    deltree(t^.L);
    deltree(t^.R);
    dispose(t);
    t := nil;
  end;
end;

Begin
  k := nil;
  repeat
    read(x);
    if x <> 0 then
      add(k, x, 1);
  until x = 0;
  printtree(k);
  readln(N);
  writeln(treemax(k, N));
  deltree(k);
  readln;
End.
PhoenixPC вне форума Ответить с цитированием
Старый 03.06.2013, 01:49   #7
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,431
По умолчанию

Попробуйте:
Код:
function treemax(t: tree; N: integer): integer;
begin
  treemax := minint;
  if t <> nil then
  begin
    if t^.ur = N then
      treemax := t^.info
    else
      treemax := max(treemax(t^.L, N), treemax(t^.R, N));
  end;
end;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Мой оригинальный Тетрис в VBA с уровнями KrutojNeProger Помощь студентам 1 18.01.2013 04:07
Нужно написать функцию, которая проверяет содержатся ли элементы из первого дерева во втором дереве, в указанном в 1 дереве порядк Laurensii Помощь студентам 2 24.12.2012 02:55
Головоломка с уровнями схемы документа DJTreeno Microsoft Office Word 8 04.07.2012 22:03
ссылки на файл в дереве jambas92 Общие вопросы C/C++ 0 24.04.2012 20:50