数据库表TreeView树的快速生成

简介:
 
数据库表TreeView树的快速生成 

根据数据表的内容生成TreeView树状结构,通常的做法就是从顶级开始,然后逐项递归查询遍历生成。这种方法在实现上容易做到,也很容易想到,但是效率比较低,因为数据库的检索(SQL语句需要解释执行,而且是对数据库文件进行操作)还是比较耗时的,尤其是树的层次较多,节点较多的情况。这里我要介绍的方法是以空间换取时间,只进行一次数据库检索,提取出全部数据,然后一次生成TreeView树状结构。通过SQL语句,让返回的记录按照父节点ID、节点ID进行排序,这样保证每次当前要添加的节点记录的父节点都已经添加到了TreeView树中,剩下的工作就是如何在TreeView树中找到父节点。这里我采用了一个排序的TStringList列表,通过排序列表采用二分查找的快速性能,就能够很快地查找到当前要添加节点的父节点,从而插入到TreeView树的正确位置。 

源代码如下(假定数据表名称为FTree,字段有ID, ParentID, Name): 
procedure MakeTree(Query: TQuery; TreeView: TTreeView); 
var 
  List: TStringList; 
  Node: TTreeNode; 
  Index: Integer; 
begin 
  TreeView.Items.BeginUpdate; 
  try 
    TreeView.Items.Clear; 

    List := TStringList.Create; 
    try 
      List.Sorted := True; 

      while not Query.Eof do 
      begin 
        if Query.FieldByName('ParentID').AsInteger = 0 then { ParentID=0,顶层节点 } 
          Node := TreeView.Items.AddChild(nil, Query.FieldByName('Name').AsString) 
        else 
        begin 
          Index := List.IndexOf(Query.FieldByName('ParentID').AsString); 
          Node := TreeView.Items.AddChild(TTreeNode(List.Objects[Index]), 
            Query.FieldByName('Name').AsString); 
        end; 
        List.AddObject(Query.FieldByName('ID').AsString, Node); 
        Query.Next; 
      end; 
    finally 
      List.Free; 
    end; 
  finally 
    TreeView.Items.EndUpdate; 
  end; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
  T: DWORD; 
begin 
  T := GetTickCount; 
  Query1.SQL.Text := 'SELECT * FROM FTree ORDER BY ParentID, ID'; 
  Query1.Open; 
  MakeTree(Query1, TreeView1); 
  Label1.Caption := Format('MakeTree所用时间: %d ms', [GetTickCount - T]);  
end;  




本文转自 byteh 51CTO博客,原文链接:http://blog.51cto.com/byteh/53665,如需转载请自行联系原作者

目录
相关文章
|
设计模式 存储 JSON
带你通关全栈树型结构设计:从数据库到前端
今天咱们要讨论的树,它不是现实结构的树,也不是数据结构要讨论的树,而是「从业务视角抽象出来的树形结构」。
788 0
|
存储 算法 Java
由树到数据库索引
二叉排序树(Binary Search Tree):又被称为二叉查找树或者二叉搜索树,当然首先是二叉树,另外特点如下: 1.若它的左子树不为空,则左子树的结点小于它根节点的值; 2.若它的右子树不为空,则右子树的结点大于它根节点的值; 3.它的左、右子树也分别为二叉排序树;
由树到数据库索引
|
数据库
LeetCode(数据库)- 树节点
LeetCode(数据库)- 树节点
89 0
|
存储 SQL PHP
多级目录树(森林)的三种数据库存储结构介绍
去年做过一个项目,需要每日对上千个Android内存泄漏(OOM)时core dump出的hprof文件进行分析,希望借助海量数据来快速定位内存泄漏的原因。最终的分析结果是一个类森林,因为时隔较远,只找到下面这个截图了。
2699 0
|
数据库 索引
数据库必知词汇:平衡多路查找树B-Tree
B-tree(多路搜索树,并不是二叉的)是一种常见的数据结构。使用B-tree结构可以显著减少定位记录时所经历的中间过程,从而加快存取速度。B-Tree中的B代表平衡(balance),而不是二叉(binary),因为B-Tree树是从最早的平衡二叉树演化而来的。这个数据结构一般用于数据库的索引,综合效率较高。
581 0
|
存储 Java 关系型数据库
【JAVA秒会技术之搞定数据库递归树】Mysql快速实现递归树状查询
Mysql快速实现递归树状查询 【前言】今天一个好朋友问我的这个问题,以前也没有用到过,恰好有时间,就帮他研究了一下,纯属“现学现卖”,正好在过程中,自己也能学习一下!个人感觉,其实一点也不难,不过是“闻道有先后”,我们是“后”罢了。按照我的习惯,学完东西,总要总结一下嘛,也当做一个备忘录了。   具体需求就不描述了,简而言之,归结为两个: 1.如何通过子节点(cid)加载出所
2479 0
下一篇
DDNS