|
盒子资源分类 |
![]() |
|
|
|
快速创建树的方法 (抛弃拙劣的数据库结构和算法) |
![]() |
关键字:快速创建树 Tree 抛弃劣质结构 算法 |
来 自:原创 |
平 台:Win9x,Win2k/XP/NT,Win2003 |
下载所需:0 火柴 |
深浅度:初级 |
完成时间:2005/12/20 |
发布者:vvyang |
发布时间:2005/12/20 |
编辑器:DELPHI7 |
语 种:简体中文 |
分 类:数据库 |
下载浏览:3512/19816 |
|
|
|
|
1、现在很多人都使用“父—子结构+递归算法”来显示树型的层次结构,但是不得不说这是一种非常拙劣的方式,下面给大家一种简单方便的数据结构和算法,快速显示树型的层次结构: 2、数据库结构 例如表“国家”可以是这样: 编号 名称 ---------- 01 中国 0101 吉林省 010101 长春市 010102 吉林市 0102 江苏省 010201 南京市 010202 常州市 02 美国 0201 密歇根州 020101 底特律市 0202 华盛顿州 020201 温哥华市 020202 西雅图市 03 澳大利亚 3、在 TreeView 中显示结构 procedure CreateTree; const ID_DEPT = 2; var nLevel: Integer; pNodes: array[0..1023] of TTreeNode; lpID, lpName: string; begin ADODataSet1.Close; ADODataSet1.CommandText := 'SELECT * FROM [国家] ORDER BY [编号]'; ADODataSet1.Open; pNodes[0] := nil; TreeView1.Items.Clear; with ADODataSet1.Recordset do while not Eof do begin lpID := Fields['编号'].Value; lpName := Fields['名称'].Value; nLevel := Length(lpID) div ID_DEPT; pNodes[nLevel] := TreeView1.Items.AddChild(pNodes[nLevel - 1], lpName); MoveNext; end; end; 4、短短 20 行,一次读取数据。有人可能问为什么把 pNodes 的大小设成 1024?你也可以设成 10000,随你便,不过 TreeView 如果有那么多节点早死机了。 |
本站原创作品,未经作者许可,严禁任何方式转载;转载作品,如果侵犯了您的权益,请联系我们! |
相关文章 |
|
![]() |
|
相关评论 |
![]() |
共有评论52条
当前显示最后6条评论
|
jlwen |
2007/8/24 23:37:54 |
思路不错的 |
hplovezy2008 |
2008/4/12 17:40:34 |
ID Data IDparents IDlayer 这样效果应该很好 |
hawklm |
2008/4/29 21:54:00 |
这个只适合层数比较少的情况,对于层数多的,就麻烦了 |
li_xl |
2010/6/15 23:52:45 |
这个代码确实简洁,不过如果层数多并且同一级的兄弟节点要讲究次序的话不知是否也可行。我目前使用的是嵌入数据库,没有使用SQL方法,代码很长,但没有楼主所说的超过1万个节点就死机的情况。我目前的节点数约2.5万个,在奔腾3、1G主频、256M内存的笔记本上运行良好。至于速度,没有对比过,不知是快是慢。 |
zcdownturn |
2011/7/31 2:56:30 |
这种方法肯定比递归快N倍,上面有人说递归还open,close,我想没有人会笨到递归还要open,close的,即使是不open,close递归也要多循环很多次,作者的方法只需循环一次,肯定会比递归快N倍,作者的这种方法是一次性读取最快的方法,当然比动态加载要慢,比递归的添加,删除,排序和移动也复杂一些,但都是可以实现的,这种方法比较适合一次性加载节点记录数在5000到3万之间,如果大于3万就请使用动态加载的方法,如果小于5000可以使用递归的方法,非常感谢作者提供这种比递归要快的方法给大家参考,不懂的人不要随便攻击作者 |
zcdownturn |
2011/7/31 3:13:05 |
也许有人不知道移动是怎么实现,我的方法是用存储过程实现的,虽然麻烦点,但并不复杂就判断一下移动的方向和批量修改一下排序的序号就可以了,谁有更好的方法请说出来让大家参考一下 |
我要发表评论 |
查看全部评论 |
|
|
|