一种非递归生成树的算法

来源:互联网 发布:macbook剪辑视频软件 编辑:程序博客网 时间:2024/06/07 19:45

这里以这样的树为例:

    a
        a1
        a2
    b
        b1
        b2
    c
        c1
        c2
            c2d

创建数据库:

CREATE TABLE [Tree] ( [ID] [bigint] IDENTITY (1, 1) NOT NULL ,
   
[Name] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
       
--这里仅比楼主的例子多了名称列,为了看起来方便。
    [PID] [bigint] NULL ,
   
[showLevel] [tinyint] NULL ,
   
CONSTRAINT [PK_Tree] PRIMARY KEY  CLUSTERED
    (
       
[ID]
    ) 
ON [PRIMARY]
)
ON [PRIMARY]
GO

插入数据内容为
ID  Name    PID    ShowLevel

1    根节点    0      1
2    a          1      1
3    b          1      2
4    c          1      3
5    a1        2      1
6    a2        2      2
7    b1        3      1
8    b2        3      2
9    c1        4      1
10  c2        4       2
11  c2d      10      1

 

编程:使用一个Button,一个ListView,全部是默认的属性
在Button中的OnClick事件中写如下代码
procedure TForm1.Button1Click(Sender: TObject);
var
  i,j:integer;
  Cnt:Integer;
  PID:Integer;
  RootNode:TTreeNodes;
  TreeNodes:Array
of TTreeNode;
  CurrNode:TTreeNode;
begin
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add(
'Select * from Tree order by pid,ShowLevel'); //排序至关重要
  ADOQuery1.Open;
  Cnt:
=ADOquery1.RecordCount;
  SetLength(TreeNodes,Cnt);

  RootNode:
=TreeView1.Items;
 
//节点信息赋值
 
for i:=0 to Cnt-1 do
 
begin
    ADOQuery1.RecNo:
=i+1;
    PID:
=AdoQuery1.fieldByName('PID').AsInteger;

   
if PID=0  then
   
begin
     
//根节点
      TreeNodes[i]:
=TreeView1.Items.Add(nil,ADOQuery1.FieldByname('Name').AsString);
      TreeNodes[i].Data:
=Pointer(ADOQuery1.FieldByName('ID').AsInteger);
   
end
   
else
   
begin
     
//子节点
     
//查找索引值
     
for j:=0 to Treeview1.Items.Count-1 do
     
begin
       
if Int64(Treeview1.Items[j].Data)=PID then
       
begin
          CurrNode:
=TreeView1.Items[j];
       
end;
     
end;
     
//TreeNodes[i]:=TreeView1.Items.AddChild(TreeNodes[PID-1],ADOQuery1.FieldByname('Name').AsString);
      TreeNodes[i]:
=TreeView1.Items.AddChild(CurrNode,ADOQuery1.FieldByname('Name').AsString);
      TreeNodes[i].Data:
=Pointer(ADOQuery1.FieldByName('ID').AsInteger);
   
end;
 
end;
end;

 

 

 

 

原创粉丝点击