Форум по программированию Delphi Sources

 



Вернуться   Форум по программированию Delphi Sources > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 09.11.2017, 19:03
hunn74 hunn74 вне форума
Прохожий
 
Регистрация: 06.11.2017
Сообщения: 6
Версия Delphi: Delphi 3
Репутация: 10
По умолчанию Работа с деревом

Поставлена задача создать дерево. Затем отрицательные элементы заменить их абсолютными значениями. Кинул на форму TreeViev и 32 кнопки. Разбираюсь в деревьях плохо, поэтому с помощью интернета и с затратой кучей времени создал такой код:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ComCtrls;
type
  PNode=^TNode;
 
  TNode=record
    nKey:Integer;
    nCount:integer;
    pLeft:pNode;
    pRight:pNode;
  end;
  Ttree=class
 
 private
   public
     fTree:pNode;
    procedure Search(x:integer;var node:PNode);
    constructor Create;
  end;
type
  TForm1 = class(TForm)
    TreeView1: TTreeView;
    Button1: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Vyvod(node:PNode;item:TTreeNode);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  t:TTree;
 
implementation
constructor TTree.Create;
begin
  fTree:=nil;
end;
procedure TTree.Search(x: Integer; var node: PNode);
begin
  if node=nil  then
  begin
    node:=new(PNode);
    with node^ do begin
      nKey:=x;
      nCount:=1;
      pLeft:=nil;
      pRight:=nil;
    end;
  end
  else
    if x<node^.nKey then
      Search(x,node^.pLeft)
    else
      if x>node^.nKey then
        Search(x,node^.pRight)
      else
        inc(node^.nCount);
end;

{$R *.DFM}



procedure TForm1.Button1Click(Sender: TObject);
var i,j,p:integer;
    b: boolean;
    item:TTreeNode;
begin
  randomize;
  t:=TTree.Create;
  for i:=0 to 12 do
  begin
   j:=random(2);
   if j=0 then b:=true else b:=false;
   p:=random(10);
   if b then t.Search(-p,t.ftree) else t.Search(p,t.ftree);
  end;
   item:=nil;
  Vyvod(t.fTree,item);
end;



procedure TForm1.Vyvod(node:PNode;item:TTreeNode);
var
  tmpitem:TTreeNode;
begin
  if node<>nil then begin
    tmpItem:=TreeView1.Items.AddChild(item,inttostr(node^.nKey));
    vyvod(node^.pLeft,tmpItem);
    vyvod(node^.pRight,tmpItem);
  end;
end;

procedure TForm1.Button3Click(Sender: TObject);
 var item:TTreeNode;
 i:integer;
begin
  TreeView1.Items.Clear;
 with t.fTree^ do
  begin
   if nKey<0 then nKey:=abs(nKey);
  end;
  item:=nil;
  Vyvod(t.fTree,item);
end;

end.
Код меняет знак только первого элемента. Как его исправить? Спасибо.
Ответить с цитированием
  #2  
Старый 09.11.2017, 19:17
hunn74 hunn74 вне форума
Прохожий
 
Регистрация: 06.11.2017
Сообщения: 6
Версия Delphi: Delphi 3
Репутация: 10
По умолчанию ЗЫ

Я ПОНИМАЮ, ЧТО ТАМ ОБХОД НУЖЕН, ТОЛЬКО КАК ЕГО РЕАЛИЗОВАТЬ?
Ответить с цитированием
  #3  
Старый 09.11.2017, 20:28
Аватар для Alegun
Alegun Alegun сейчас на форуме
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 2,760
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Оффтоп на ЗЫ: Зачем кричать-то, итак хорошо всё слышно -)
Цитата:
Сообщение от hunn74
...Код меняет знак только первого элемента...
Да собсно у вас так и заложено: в обработчике жима третьей кнопки первым делом очищается полностью содержимоё TreeView и затем туда вставляется "обработанный" узел, а на момент выполнения Vyvod он единственный

Бегать нужно в цикле, лучше рекурсией, примерно так (обход всех ответвлений елемента)
Код:
function TDBTreeView.RecurseChilds(node: TTreeNode): double;
begin
while node <> nil do begin
   if node.HasChildren then
      Result := RecurseChilds(node.GetFirstChild);
   Result := Result + GetResultForNode(node));
   node := node.GetNextSibling;
end;
end;

function TDBTreeView.GetResult(curnode: TTreeNode;): double;
begin
Result := 0;
if curnode = nil then Exit;
Result := RecurseChilds(curnode.GetFirstChild);
end;
drkb
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо Alegun за это полезное сообщение:
Guaho (10.11.2017), hunn74 (11.11.2017)
  #4  
Старый 11.11.2017, 17:10
hunn74 hunn74 вне форума
Прохожий
 
Регистрация: 06.11.2017
Сообщения: 6
Версия Delphi: Delphi 3
Репутация: 10
По умолчанию

Спасибо!!!
Ответить с цитированием
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:52.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources", 2004-2017

ВКонтакте   Facebook   Twitter