函数递归在树形结构数据遍历中应用.doc

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
函数递归在树形结构数据遍历中的应用 我们在使用树形结构数据时,常常需要遍历整棵树或某一支下的所有结点,用于查找、打印等功能。因为树形结构不同于数组、链表等简单数据结构,它像树枝一样每个根结点可以具有多个子结点,无限延展,因此需要专门的算法去遍历。树形结构的遍历有很多种方法,下面我们以紫金桥监控组态软件(以下简称为“RealInfo”)为例,简单讲解函数递归在这种遍历方法中的应用。 在RealInfo中,“树形控件”是表示树状结构数据的组件,“自由报表”是表示表格数据的组件,这两种组件自身都提供了一些常用方法。我们现在实现这样的功能:将树形控件中的指定分支数据打印在自由报表中。可以利用窗口自定义函数的递归功能。 树形控件中的数据显示方式如下图所示: 每个结点以结点编码为唯一标识,每个结点可以显示一个字符串作为结点文本(详见RealInfo联机帮助)。 本例中,我们将树形结构数据打印在自由报表上,其效果如下图所示: 每个根结点打印完成后,遇到子结点时打印位置自动向右、向下移动一个单元格;遇到兄弟结点时打印位置向下移动一个单元格。 现在我们开始分析算法。我们知道,树的遍历是指沿着某条搜索路线,依次对中每个结点均做一次且仅做一次访问 函数首先判断输入结点是否具有子结点,如果没有则返回,如果有则取得子结点列表,然后循环打印每个子结点并递归调用自身函数打印其子结点,当一个结点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.ColCount()nCol then #report.AddCol(1); endif for i=0 to nCount if #report.RowCount()nRow+nRowOffset then #report.AddRow(1); endif strNodeText = #tree.GetNodeTxt(strArrChildNodeKeys[i]); //打印本结点 #report.SetTxt(nCol,nRow+nRowOffset,strNodeText); nRowOffset = nRowOffset + 1; nRowOffset = func_PrintToReport(strArrChildNodeKeys[i] ,nCol+1,nRow,nRowOffset); //递归 next endif return nRowOffset; 创建窗口函数(用于打印初始结点自身,并启动

文档评论(0)

kehan123 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档