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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.06.2015, 18:20   #1
Ovenvan
Пользователь
 
Регистрация: 09.06.2015
Сообщений: 21
По умолчанию Delphi (Lazarus). Удаление нечётных элементов в дереве.

Добрый день. Нужна помощь в такой вот задаче: необходимо удалить все нечётные элементы дерева. Что-то не разобрался в деревьях. Буду рад любой помощи.
Ovenvan вне форума Ответить с цитированием
Старый 15.06.2015, 18:32   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А построить древо сможешь?
Или тут тоже швах?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.06.2015, 18:51   #3
Ovenvan
Пользователь
 
Регистрация: 09.06.2015
Сообщений: 21
По умолчанию

Думаю, построить смогу... Меня больше именно процедура удаления нечётных элементов и все, связанные с ней, интересуют
Ovenvan вне форума Ответить с цитированием
Старый 15.06.2015, 20:26   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Поскольку код построения у тебя не вижу просто опишу теорию, как я ее понимаю: Ты создаешь некую процедуру, которая вызывается рекурсивно, в нее передаешь ветку, которую нужно проверить. В цикле в этой функции проходишь эту ветку, и если у нее есть свои ветки, вызываешь функцию, передавая ей найденную подветку. Если данные ветки равны чему-то вызываешь еще одну функцию (которую конечно же ты напишешь), чтоб освободить все входящие в ней ветки так же рекурсивно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.06.2015, 21:38   #5
Ovenvan
Пользователь
 
Регистрация: 09.06.2015
Сообщений: 21
По умолчанию

Теоретически я могу представить, как это реализуется, у меня именно затуп с реализацией. Поэтому я прошу помощи.
Ввод (создание дерева) вроде написал. На форме - Edit и кнопка. В Edit ввожу числа через пробел - это и есть элементы дерева.
Код:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

type
  PTree = ^TTree;
  TTree = record
    Data: integer;
    L, R: PTree;
  end;

var
  Form1: TForm1;
  Tree: PTree;

implementation

{$R *.lfm}

{ TForm1 }

procedure del(var Anode: Ptree);
begin
  if Anode <> nil then
  begin
    if Anode^.L <> nil then del(Anode^.L);
    if Anode^.R <> nil then del(Anode^.R);
    dispose(Anode);
    Anode := nil;
  end;
end;

procedure Add(var ANode: PTree; x: integer);
begin
   if ANode = nil then
   begin
     new(Anode);
     Anode^.L:= nil;
     Anode^.R:= nil;
     Anode^.Data:= x;
   end
   else if x >= ANode^.Data then Add(Anode^.R, x)
   else Add(Anode^.L, x);
end;

{ввод даных}
procedure TForm1.Button1Click(Sender: TObject);
var s: string;
begin
   s:= Edit1.text;
   s:= trim(s);
   del(Tree);
   while pos(' ', s) <> 0 do
   begin
     add(Tree, strtoint(copy(s, 1,pos(' ', s) - 1)));
     delete(s, 1, pos(' ', s));
   end;
   if s <> ' ' then add(Tree, strtoint(s));
end;

end.
А вот, что дальше делать - не знаю. Надеюсь на Вас.
Ovenvan вне форума Ответить с цитированием
Старый 16.06.2015, 09:05   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ага... агаагаага...
Значит дальше... С потолка пишу, не проверяю, ок?
Код:
procedure StepByStep(var Branch:PTree,WhatFind:Integer);
begin
 if Branch^.Data=WhatFind then begin
  if Branch^.L<>nil then DeleteBranch(Branch^.L);
  if Branch^.R<>nil then DeleteBranch(Branch^.R);
  dispose(Branch);
  Branch:=nil;
 end else begin
  if Branch^.L<>nil then StepByStep(Branch^.L);
  if Branch^.R<>nil then StepByStep(Branch^.R);
 end;
end;
И удаление:
Код:
procedure DeleteBranch(var Branch:PTree);
begin
  if Branch^.L<>nil then DeleteBranch(Branch^.L);
  if Branch^.R<>nil then DeleteBranch(Branch^.R);
  Dispose(Branch);
  Branch:=nil;
end;
Вот примерно так. Это удаление веток с определенным значением.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.06.2015, 10:23   #7
Ovenvan
Пользователь
 
Регистрация: 09.06.2015
Сообщений: 21
По умолчанию

Возникло у меня несколько вопросов по вашему решению.
Ваша процедура удаления не то же самое, что моя удаления? Или я что-то не понял?
Как в Вашу процедуру добавить проверку на нечётность? Разве не нужно проходить всё дерево для этого?
Ovenvan вне форума Ответить с цитированием
Старый 16.06.2015, 10:57   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Ваша процедура удаления не то же самое, что моя удаления? Или я что-то не понял?
Твоя, как я вижу, очищает дерево целиком и полностью.
А я разделил на две части - одна делает проход, вторая освобождает ветвь, что попадает под условие. Т.е. у тебя я не вижу механизма анализа что удалять а что оставлять.
Цитата:
Как в Вашу процедуру добавить проверку на нечётность?
Странный вопрос... Как проверять integer на нечетность? Неужели не знаешь?
функцией odd() или оператором mod... Не?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сформировать список из N случайных элементов. Вставить после каждого четного элемента, звено с количеством нечётных элементов newbieee Паскаль, Turbo Pascal, PascalABC.NET 3 08.11.2014 14:14
Заменить максимальный элемент суммой всех нечётных элементов матрицы Alexar Makken Паскаль, Turbo Pascal, PascalABC.NET 2 08.06.2011 13:30
Найти количество отрицательных и нечётных элементов. Wiedzzmin Паскаль, Turbo Pascal, PascalABC.NET 1 31.05.2010 22:03
Удаление вершины в бинарном дереве lebrosha Помощь студентам 2 24.05.2009 13:51