|
#1
|
|||
|
|||
Работа с деревом
Поставлена задача создать дерево. Затем отрицательные элементы заменить их абсолютными значениями. Кинул на форму 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
|
|||
|
|||
ЗЫ
Я ПОНИМАЮ, ЧТО ТАМ ОБХОД НУЖЕН, ТОЛЬКО КАК ЕГО РЕАЛИЗОВАТЬ?
|
#3
|
||||
|
||||
Оффтоп на ЗЫ: Зачем кричать-то, итак хорошо всё слышно -)
Цитата:
Бегать нужно в цикле, лучше рекурсией, примерно так (обход всех ответвлений елемента) Код:
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; Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#4
|
|||
|
|||
Спасибо!!!
|