根据数据库表中记录自动构造一棵结构树的一种高效算法
日期:2007年5月18日 作者: 查看:[大字体 中字体 小字体]-
在好多场合下,都存在着很多像树一样的结构;如公司机构、军队职务、图书管理等,甚至好多论坛上的信息都是以树形的结构显示出来的。由于这样的结构存在无限子类、无限级别、信息多变的特点。无法由一开始就设计好一种结构,而往往这种结构是随时都可能改变的。这样,就需要有一种可以根据一批信息自动构造一棵结构树的算法。
当今绝大多数信息是以数据库的形式保存起来的,下面我们就以数据库为操作源,以Delphi为编程工具,介绍一种根据数据库表中记录自动构造一棵结构树的一种高效算法。
二、数据库表结构设计:
数据库表的结构设计关系到构造树的难易程序与速度,所以数据库表结构一定要设计合理,巧妙!在本算法中,数据库表结构关系到构造树的有三个字段,它们分别是:
字 段 名
代 表 意 义
字段类型
其它说明
NodeID
结点自身ID号
自动编号
关键字
NodeName
结点名称
字符类型
不能为空
PNodeID
父结点ID号
长整形
不能为空,默认值为0表示为一级结点
当然还可以加入其它字段作为实际意义的信息记录,不过构造一棵结构树只需要用到上面所提到的三个字段。下面是一张数据库表的例子:

三、数据结构设计:
同样,为了使构造好的一棵树中每一个结点都能对应到实际表中的相应记录(即当选择某结点时,表指针能自动指向相应的记录),必须设计一个结构体;结构体如下(Pascal描述):
// 定义树结点与数据库表记录对应的结构体
type
PNode = ^TNode;
TNode = record
FID:integer; // 记录的ID号
FBM:TBookMark; // 定位记录的指针(书签)
end;
四、算法:
1、首先,数据库必须打开,使用一个查询得到要构造树的表,得到的表已经按一定的规则排好序;其SQL执行语句如下:
select * from Department order by PNodeID,NodeID
2、为了构造一棵属于自已的子树,可以选构造一棵属于自已的一级子树,然后采用递归算法,以子结点为子树的根结点,逐个构造它们的一级子树;逐层构造,递归,这样就形成了一棵我们想要得到的结构树;
3、为了构造一棵属于自已的一级子树,我们可以用一个Select 语句查询得到所有属于自已的子结点记录,但是我们不这样做,因为这样会反复执行好多次Select 语句,造成多次进行磁盘操作甚至网络访问,导致速度变慢,而且不方便结点与记录的感应;在这里,我们充分的利用了已打开表已经排好序的特点,利用DataSet 的Local方法找到第一个子结点的记录,然而表已按父结点排好序,如果有兄弟结点,肯定是紧跟其后;当我们找到第一个子结点后,再一条一条的下移一条记录,如果有相同的父结点,我们加入到树中,如果没有了或已到表结尾了,构造一级子树完毕,就返回(此时,记得将记录回滚到上一条)。 - [1] [2] [3] [4] 下一页
-
- 根据数据库表中记录自动构造一棵结构树的一种高效算法 相关文章:
- 根据数据库表中记录自动构造一棵结构树的一种高效算法 相关软件
- 特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作
- 者.文章版权归文章原始作者所有.对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转
- 载的文章有版权问题请联系编辑人员,我们尽快予以更正. 转载请注明来源:http://www.hackhome.com
上一篇:在程序中加入英文朗读功能
下一篇:日历函数单元
精品推荐
热点TOP10
- ·C#编写的windows计算器-源代码
- ·身份证号码15位升18位(C#)
- ·AspNetPager分页控件--使用方法
- ·asp.net开发wap程序必备:识别来访手机品牌型号
- ·客户端回调实现gridView无刷新分页
- ·C#设计的一个向导程序(Wizard)框架
- ·C#導出Excel源碼
- ·ASP.Net2.0 GridView 多列排序 显示排序图标,分页
- ·c#操作word表格
- ·.net操纵xml文件类(c#)
- ·asp.net(C#)海量数据表高效率分页算法(易懂,不使用存储过程)
- ·六步使用ICallbackEventHandler实现无刷新回调
- ·用ASP.NET建立一个在线RSS新闻聚合器
- ·为DataGrid创建自定义列控件
- ·日历函数单元
- ·动态修改.Net StreamReader Encoding编码
- ·ASP.NET 生成 RSS Feed
- ·ASP.NET2.0下含有DropDownList的GridView编辑、删除的完整例子!
- ·ASP.NET购物车的实现及结算处理
- ·对于SSH crc32 compensation attack detector exploit 的分析
特别推荐
- ·ASP.NET程序中常用的三十三种代码
- ·ASP.Net中保护自定义的服务器控件
- ·C#设计的一个向导程序(Wizard)框架
- ·.net中即时消息发送的实现……
- ·ASP.NET动态创建控件之绝境求生
- ·.NET调用Oracle存储过程,使用数组类型的参数(如ArrayList)
- ·C#中水晶按钮的程序生成
- ·日历函数单元
- ·图片保存到数据库和从数据库读取图片并显示(c#)
- ·ASP.NET2.0下含有DropDownList的GridView编辑、删除的完整例子!
- ·C#中四种进程或线程同步互斥的控制方法
- ·[C#]解决读写包含汉字的txt文件时乱码的问题
- ·AspNetPager分页控件--使用方法
- ·六步使用ICallbackEventHandler实现无刷新回调
- ·从 ASP.NET 服务器控件插入客户端脚本
- ·C#導出Excel源碼
- ·Asp.net直接保存文件到客户端
- ·如何在上传的图片上写字
- ·Access 通用数据访问类(asp.net 2.0 c#)
- ·asp.net关于文件在数据库的存入和读取
