树的快速创建算法,只需读一次数据库.

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.

快速创建树 算法 treeCreate treeview相关推荐

  1. Flex使用mx:Tree控件创建树(可添加和删除节点)

    Flex使用<mx:Tree>控件创建树的在线运行效果见:http://tongqiuyan.blog.163.com/blog/static/1955453022011927102332 ...

  2. Intel发布神经网络压缩库Distiller:快速利用前沿算法压缩PyTorch模型

    Intel发布神经网络压缩库Distiller:快速利用前沿算法压缩PyTorch模型 原文:https://blog.csdn.net/u011808673/article/details/8079 ...

  3. 图像和视频的快速去雾算法研究

    王昕, 孙莹莹, 李影昉. 图像和视频的快速去雾算法研究[J]. 影像科学与光化学, 2016, 34(1): 82-87.   WANG Xin, SUN Yingying, LI Yingfang ...

  4. 一种改进的快速人脸检测算法

    人脸检测是计算机视觉及相关领域的关键技术,在智能人机交互.视频会议.安全监控等方面都有着广阔的应用前景.目前人脸检测方法主要有基于知识的方法和基于统计学习的方法[1].其中,基于知识的检测算法首先抽取 ...

  5. MATLAB可视化实战系列(二十八)-贪心算法求快速平方根倒数算法中的“魔术数字”【含matlab源代码】

    前言 快速平方根倒数算法(Fast InvSqrt)是一种快速计算平方根的倒数的算法,常用于向量标准化运算,在光照渲染中有重要应用.此算法最早可能是于90年代前期由SGI所发明,后来于1999年在&l ...

  6. 快速了解Bagging算法

    快速了解Bagging算法 Boostrap sampling 自助采样 Bagging算法 Bagging性能 Boostrap sampling 自助采样  之前已经讲过模型的评估方法中有留一法( ...

  7. 编写一个字节数的rtu C语言校验程序,Modbus通信协议中CRC校验的快速C语言算法

    Modbus通信协议中CRC校验的快速C语言算法 2004年第11期 福 建 电 脑 63 Modbus通信协议中CRC校验的快速C语言算法 孟开元 (西安石油大学计算机学院陕西西安710065) [ ...

  8. es 怎么嵌入 算法模型_快速ES-RNN: ES-RNN算法的GPU实现

    快速ES-RNN: ES-RNN算法的GPU实现 题目: Fast ES-RNN: A GPU Implementation of the ES-RNN Algorithm 作者: Andrew Re ...

  9. 均方根误差不超过_快速平方根倒数算法

    论文地址戳这里​www.lomont.org 一. 介绍 快速平方根倒数算法也称为平方根倒数速算法(Fast Inverse Square Root)是用于快速计算 的一种算法.此算法由于出现在< ...

最新文章

  1. javascript 队列
  2. redhat 配置yum代理源
  3. js返回顶部和始终保持底部
  4. java 清空jframe_java – 在新游戏中清除我的JFrame和JPanel
  5. MySQL_常见函数
  6. linux安装 icc编译器,安装 Intel Compiler (ifort icc icpc)
  7. mac 下更新python
  8. Vue-Socket.io
  9. android中的oom,Android OOM Adjustments
  10. 形式语言与自动机之一 语言与文法
  11. 国自然的技术路线图?用PPT试试
  12. 使用openwrt-SDK 生成IPK
  13. Linux设置每分钟、每小时、每天、每周、每月、每年定时执行
  14. 【面经】京东搜索广告算法一面
  15. Cadence PSpice 补充1:脉冲信号源的详细介绍与使用方法图文演示
  16. 全国省市县sql(完整版)
  17. Codeforces Round #599 (Div. 2) B2. Character Swap (Hard Version)
  18. 固态硬盘坏了怎么恢复数据恢复
  19. python中模拟浏览器抓取网页(-)
  20. 激活函数(sigmoid、tanh、ReLU、leaky ReLU)

热门文章

  1. centos 7 显示远程窗口到本地
  2. 日期选择器:jquery datepicker的使用
  3. 解决佳能MG3080、MG2980打印机报错5B00无法打印的问题
  4. geotools 的书籍
  5. 【笔记】WGAN GP :WGAN自己的李普西斯条件是gradient clipping(大部分weight是正负0.01),在此基础上增加新的motivation让WGAN GP实现李普西斯条件
  6. POI导出Excel遇到数据量大该如何解决
  7. StarlingX分布式云部署(抢鲜)
  8. 百度/Google 高级搜索语法大全
  9. 玩转STM32F0 Value Line Discovery 之 GPIO配置工具
  10. php输出圆周率100位,圆周率1500多位