网上文摘 小说 Flash游戏 最近更新 下载排行 资源分类 下载指南
经典编程资源 精彩不容错过
设为首页
加入收藏
联系我们
当前位置:Delphi园地技巧文章编程心得 → 树的快速创建算法
树的快速创建算法
日期:2005年11月8日 作者:tangming500tom@tom.com 人气: 查看:[大字体 中字体 小字体]
unit U_CreateTree;

interface

uses
 Classes, ComCtrls, ADODB, SysUtils;

type
 PPNodedata=^TNodeData;
 TNodeData = record
  ID:integer;//节点编号
  PID:Integer;//父节点编号
  Name:string;//节点名称
  child:PPNodedata;//孩子节点
  brather:PPNodedata;//兄弟节点
 end;
 PNodeData = PPNodeData;
 TTreeFill1 = class(TThread)
  TV: TTreeView;
  RootID:Integer;
  ptr:PPNodeData;
  root:PPNodeData;//根节点
  PointNode:PPNodeData;
  s:array[0..10000] of PPNodeData;
  constructor Create(Root_Id:integer;ATreeView: TTreeView);
 private
  procedure AddTree(Node: TTreeNode; PN: PNodeData);
 protected
  procedure Execute; override;
 end;
implementation
uses U_Main, DateUtils;
var count,nodeCount:Integer;
//------------------------------------------------------------------------------
constructor TTreeFill1.Create(Root_Id:integer;ATreeView:TTreeView);
begin
 TV:= ATreeView;
 TV.Items.Clear;
 RootID:=Root_Id;
 inherited Create(False);
end;
//------------------------------------------------------------------------------
procedure TTreeFill1.Execute;
var Query: TADOQuery;
  i,j:Integer;
  Node: TTreeNode;
begin
 FreeOnTerminate := True;
 TV.Items.Clear;
 with Query do
  begin
   Query := TADOQuery.Create(nil);
   Connection := frm_Main.ADOC_SQL;//需要更改
   Close;
   SQL.Clear;
   SQL.Add('Select * from 部门表 order by 部门编号 ');
   Open;
   first;
   count:=recordcount;
   if count>0 then
    begin
     for i:=0 to recordcount-1 do
      begin
       new(PointNode);
       PointNode^.child:=nil;
       PointNode.brather:=nil;
       PointNode^.ID:=fieldbyname('部门编号').AsInteger;
       PointNode^.PID:=fieldbyname('父部门编号').AsInteger;
       PointNode^.Name:=fieldbyname('部门名称').AsString;
       s[i]:= PointNode;
       next;
      end;
    end;
   free;
  end;
//------创建树------------------------
for i:=0 to count-1 do
 begin
  for j:=0 to count-1 do
   if s[i]^.PID=s[j]^.ID then
    begin
     if s[j]^.child=nil then
      s[j]^.child:=s[i]
     else
      begin
       ptr:= s[j]^.child;
       while (ptr.brather<>nil) do
        ptr:=ptr^.brather;
       ptr.brather:=s[i];
      end;
    end;
 end;
for i:=0 to count-1 do
if s[i]^.ID=RootID then
begin
  root:=s[i]; //根节点
  break;
end;
Node:=TV.Items.AddObject(nil,Root^.Name,Root);//创建树的根节点
nodeCount:=0;
Node.ImageIndex := 0;
Node.SelectedIndex := 2;
AddTree(Node,root);

end;
procedure TTreeFill1.AddTree(Node:TTreeNode;PN:PNodeData);
var
  nNode: TTreeNode;
  PNode,q: PNodeData;
begin
PNode:=PN;
if PNode.child<>nil then
 begin
   q:=PNode.child;
   while (q<>nil) do
   begin
    nNode:=TV.Items.AddchildObject(Node,q^.Name,q);
    nodeCount:=nodeCount+1;
    AddTree(nNode,q);
    q:=q^.brather;
   end;
 end;
end;

end.

作者联系方式: qq:13575437

(出处:DelphiFans.com)

相关文章:
·根据数据库创建无限深度的Tree
·TreeView的遍历
·使用dxTreeList的列宽适应内容的最长值
·TreeView使用笔记
·仅仅十几行代码实现对TreeView的遍历
·如何给TreeView中的每一项加上可复选框的CheckBox?
 → 特别推荐
 → 热点TOP10
关于我们 | 广告服务 | 发布资源 | 联系站长 Copyright © 2002-2006 Delphi园地 All Rights Reserved