有兴趣的哥们儿来一起聊聊pb里的树的遍历问题

lovemindi 2000-12-13 04:31:00
我终于遇到了树的遍历,别人告诉我一个方法:
一层层的找出每一层的所有节点,存到数组或者数据存储中。但是,我不会。希望那位大哥能帮忙,顺手写两行代码。或者可以说说树的遍历还有没有其他的好办法。
只要有道理,就奉分。多谢了。
...全文
352 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
viv_wangsc 2000-12-23
  • 打赏
  • 举报
回复
好了,给大家一个菜单遍历的源代码,希望能够让大家理解对于树的处理;

函数:f_ctrl_menu
参数:menu as_menu
返回:无
说明:在菜单的selected事件中定义了权限的控制规则

//逐级触发菜单的selected事件
as_menu.TriggerEvent(selected!)
int li_row
li_row = UpperBound(as_menu.item)
for li_row=1 to UpperBound(as_menu.item)
//递归调用函数本身处理子菜单,从而遍历整个菜单
f_ctrl_menu(as_menu.item[li_row])
next
viv_wangsc 2000-12-23
  • 打赏
  • 举报
回复
树的定义其实是递归定义的,也就是说树的孩子也是树或是一个空节点;
现实生活中比如说会计科目,层次性编码都属于树结构;
在处理树的时候如果要遍历,首先取出树的根节点,遍历根的孩子,同时,根的孩子也是一棵树,所以它可以调用同样的函数遍历它的孩子直到遍历完整棵树;

上面我写的代码就是基于这个思想,对于遍历菜单主要是用于权限控制,菜单也是树的结构,我很久以前做过,也是采用上面的方法递归从而遍历整棵树的;
datastore是用来检索一棵树的孩子的,对于每次函数调用都会创建一个datastore,当然菜单好象有一个submenu属性它的遍历就没有必要使用datastore了,不同的情况使用数组也可以,主要是在类似堆栈的结构保存它的所有孩子;

如果有什么具体的问题与想法请详细的告诉我,我会告诉你具体的做法;

God will bless you code;
blueswind 2000-12-22
  • 打赏
  • 举报
回复
看你要做的具体东西了, pb提供查找函数为何不用?!
对于没有函数的就的自己写了, 例如遍历菜单?!
而datastore 是在已经遍历之后才赋值的? 用来存储项目对应的数据用处?!
viv_wangsc 2000-12-21
  • 打赏
  • 举报
回复
首先建立一个根节点;
然后做一个数据储存(datastore)
该数据储存能够检索出一个节点的所有子节点;
然后使用对根节点调用函数wf_poplate_item,该函数有一个参数为节点句柄;
wf_poplate负责检索出所有子节点并插入节点入树并调用wf_poplate_item继续调用节点
然后在参数wf_poplate_item再递归调用即OK

//弹出树对应的所有孩子
treeviewitem ltvi_current
GetItem(handle,ltvi_current)
wf_poplate_item(ltvi_current)

lovemindi 2000-12-21
  • 打赏
  • 举报
回复
liguanyi 同志的办法是个好办法,但是恐怕当我们建树的时候都不愿意特地去另外做一个可有可无的数据窗口吧?反而还是romance_zhang同志的办法比较正统,但是!好像用这种递归的方法很容易发生“数据溢出”的错误,不是吗?
在pb中可以很简单的用函数
finditem(firstvisibletreeitem!,handle)
来找出所有的节点,可是这样做必须要把整棵树全部展开才可以。
请问:还有没有其他的更好的办法呢?
等下次我再一并给分吧!各位说的都有道理。
blueswind 2000-12-21
  • 打赏
  • 举报
回复
递归!
格利高里 2000-12-20
  • 打赏
  • 举报
回复
哈哈,太麻烦啦。我来说个好办法。
我用动态的TreeView的时候,都和一个DataWindow绑定在一起。
这个DataWindow有 handle、ItemData 、ItemText等几个列,
然后把TreeView的信息都保存到DataWindow里,把TreeView的
遍历、查找等都转换成了对DataWindow的查找。速度极快、非常
方便!高兴的话,你可以做一个通用Class出来。我倒是有一个
不过现在很少用PB了。
romance_zhang 2000-12-15
  • 打赏
  • 举报
回复
to kinist
你的方法虽然可行,但并非树的遍历的通用算法,对吗?而且在treeview中,你无法避免item焦点移动的问题.
盘谷 2000-12-15
  • 打赏
  • 举报
回复
数的每一个节点都有一个句柄(long型的数值),你可以得到最后一个节点的句柄last_handle,然后通过循环得到每个节点的句柄,想怎么样都可以!(提醒一点,这个数值是每个节点的绝对位置)
romance_zhang 2000-12-13
  • 打赏
  • 举报
回复
我认为在TreeView控件中查找特定的TreeViewItem就是一个简单的数的遍历问题:

下面的例子是在tv_1中统计data = as_parm的treeviewitem的个数,调用函数of_find()即可

// Public Subroutine of_find(String as_parm, ref Integer ai_num)

Long ll_root

ll_root = tv_1.FindItem(RootTreeItem!, 0)
Do While ll_root > 0
of_find_child(ll_root, as_parm, ai_num)
ll_root = tv_1.FindItem(NextTreeItem!, ll_root)
Loop

MessageBox('',ai_num)



// Private Function of_find_child(Long al_handle, String as_parm, ref Integer ai_num)
TreeViewItem ltvi_item
Long ll_handle

tv_1.GetItem(al_handle, ltvi_item)
IF ltvi_item.Data = as_parm Then
ai_num = ai_num + 1
End IF

ll_handle = ltvi_item.FindItem(ChildTreeItem!, al_handle)
Do While ll_handle > 0
of_find_child(ll_handle, as_parm, ai_num)
ll_handle = ltvi_item.FindItem(NextTreeItem! , ll_handle)
Loop

edong 2000-12-13
  • 打赏
  • 举报
回复
什么树?二叉树?
找本数据结构的书肯定有现成的算法。

1,079

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 相关问题讨论
社区管理员
  • 基础类社区
  • WorldMobile
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧