- 1、本文档共28页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
2016新编函数递归在树形结构数据遍历中的应用.doc
函数递归在树形结构数据遍历中的应用
我们在使用树形结构数据时,常常需要遍历整棵树或某一支下的所有结点,用于查找、打印等功能。因为树形结构不同于数组、链表等简单数据结构,它像树枝一样每个根结点可以具有多个子结点,无限延展,因此需要专门的算法去遍历。树形结构的遍历有很多种方法,下面我们以紫金桥监控组态软件(以下简称为“RealInfo”)为例,简单讲解函数递归在这种遍历方法中的应用。
在RealInfo中,“树形控件”是表示树状结构数据的组件,“自由报表”是表示表格数据的组件,这两种组件自身都提供了一些常用方法。我们现在实现这样的功能:将树形控件中的指定分支数据打印在自由报表中。可以利用窗口自定义函数的递归功能。
树形控件中的数据显示方式如下图所示:
每个结点以结点编码为唯一标识,每个结点可以显示一个字符串作为结点文本(详见RealInfo联机帮助)。
本例中,我们将树形结构数据打印在自由报表上,其效果如下图所示:
每个根结点打印完成后,遇到子结点时打印位置自动向右、向下移动一个单元格;遇到兄弟结点时打印位置向下移动一个单元格。
现在我们开始分析算法。我们知道,树的遍历是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。这样,我们把遍历过程想象成为一次单程旅行,出发点是树的根结点,然后按先自左向右、然后自上而下的顺序,先后经过每个结点,最后走到最下方的叶子结点处。
我们可以采用这样的遍历方式:
当所在结点具有子结点时,那么按自左向右原则,接着访问它的第一个子结点,直到所在结点没有子结点为止。
当所在结点没有子结点,但具有兄弟结点时,那么按自上向下原则依次访问它的兄弟结点。
当所在结点没有子结点,而且没有兄弟结点时,那么按自上向下原则访问它父结点的兄弟结点。
分析这个过程并观察树形结构,我们会发现,每个父结点可以拥有n(n=0)个子结点,若将这n个子结点看作父结点,则每个父结点仍然具有n个子结点。由此看来,每一支数据乃至整棵树都可以看作是有限个父-子结构的组合。在树的遍历过程中,总是不断的重复“父→子”这一访问方式,因此我们可以提取这一方式形成一个函数,并利用函数递归来完成整个遍历。
这个函数用于根据输入的父结点编码和起始打印位置将其所有子结点打印出来。算法如下:
函数首先判断输入结点是否具有子结点,如果没有则返回,如果有则取得子结点列表,然后循环打印每个子结点并递归调用自身函数打印其子结点,当一个结点a的子结点打印完毕并返回后按相同规则依次打印的a结点的兄弟结点,直到所有兄弟结点打印完毕为止。
工程制作过程如下:
新建窗口,创建树形控件,起名为“tree”;创建自由报表起名为“report”;创建一个按钮。
创建窗口函数(用于得到指定结点的子结点编码数组):
func_GetAllChildNodeKey(Tree treeObj, String strFatherNodeKey, String Array strArrChildNodeKeys) As Int
代码如下:
int nChildNodeCount = 0;
string strNodeKeyTemp = ;
int i = 0;
strArrChildNodeKeys.Clear();
nChildNodeCount = #treeObj.GetNodeCount(strFatherNodeKey);
for i=0 to nChildNodeCount
if strFatherNodeKey== then
strNodeKeyTemp = IntToStr(i,10);
else
strNodeKeyTemp = strFatherNodeKey + . + IntToStr(i,10);
endif
strArrChildNodeKeys.Add(strNodeKeyTemp);
next
return nChildNodeCount;
创建窗口函数(用于递归打印指定结点的子结点,不打印自身结点):
func_PrintToReport(String strFatherNodeKey, Int nCol, Int nRow, Int nRowOffSet) As Int
代码如下:
string strArrChildNodeKeys[];
string strNodeText = ;
int nCount = 0;
int i = 0;
func_GetAllChildNodeKey(#tree,strFatherNodeKey,strArrChildNodeKeys);
nCount = strArrChildNodeKeys.GetCount();
if nCount0 then
if #report.Co
您可能关注的文档
- 2016年尚蓝轩 执业医师助理医师考试题库呼吸系统练习0701【精选】.doc
- 【课件设计及相关资源】导学案___化学反应的方向第二课时___化学___普通高中___韩毅___3706840701.doc
- 人教版九年级化学整册同步测试习题精选300页含谜底(上)22876[整理版].doc
- [复习]人教版九年级化学整册同步测试习题精选300页含答案(上).doc
- 人教版九年级化学整册同步测试习题精选300页含谜底(上)21672[精品].doc
- 2012年执业医师、助理医师 病例分析56.doc
- 关于宝宝生日祝福语大全__希望你身体强壮,快快长大,越长越可爱.doc
- 无机化学(天大版)复习资料.doc
- 7-5《昆虫记》导读及习题答案【优质】.doc
- [昆虫记名著阅读练习题]36《昆虫记》阅读题【含答案】.doc
文档评论(0)