如何对CTreeCtrl遍历和查找,大家可以学习下 Hard study!

IT_SKY_888 2010-04-28 12:31:42
VC编程中,若要展现一个树形结构,我们基本都会继承CTreeCtrl进行扩展。通过InsertItem、SetItemData等操作可以建立起一颗树并展现出来。对树的操作,最常用的就是遍历和查找。如何遍历一个CTreeCtrl呢,以下是采用递归完成的遍历树的函数


遍历树
//hitem:待遍历树的根节点

void TreeVisit(HTREEITEM hItem)

{

AfxMessageBox(GetItemText(hItem));

  if(ItemHasChildren(hItem))

  {

   HTREEITEM hChildItem = GetChildItem(hItem);

   while(hChildItem!=NULL)

   {

    TreeVisit(hChildItem); //递归遍历孩子节点

     hChildItem = GetNextItem(hChildItem, TVGN_NEXT);

   }

  }

}



如何根据名称查找树中的某个节点

//item:待遍历树的根节点,strtext:待查找节点名称

HTREEITEM finditem(HTREEITEM item, CString strtext)

{

HTREEITEM hfind;



//空树,直接返回NULL

if(item == NULL)

return NULL;



//遍历查找

while(item!=NULL)

{

//当前节点即所需查找节点

if(GetItemText(item) == strtext)

return item;



//查找当前节点的子节点

if(ItemHasChildren(item))

{

item = GetChildItem(item);

//递归调用查找子节点下节点

hfind = finditem(item,strtext);

if(hfind)

{

return hfind;

}

else //子节点中未发现所需节点,继续查找兄弟节点

item = GetNextSiblingItem(GetParentItem(item));



}

else{ //若无子节点,继续查找兄弟节点

item = GetNextSiblingItem(item);

}

}



return item;

}



这两个函数均在CTreeCtrl的扩展类当中做为成员函数即可实现树的遍历和查找。

两个函数遍历的实质是相同的:先查找第一个子节点,再查找以该节点为根的子树,再逐个查找该子节点的兄弟节点,最终完成遍历。第二个函数在找到符合条件的节点时即返回,而第一个函数则访问了树的所有节点。



这两个函数均在CTreeCtrl的扩展类当中做为成员函数即可实现树的遍历和查找。

两个函数遍历的实质是相同的:先查找第一个子节点,再查找以该节点为根的子树,再逐个查找该子节点的兄弟节点,最终完成遍历。第二个函数在找到符合条件的节点时即返回,而第一个函数则访问了树的所有节点。

两个函数均在VC60环境下编译运行通过。

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
HTREEITEM hRoot = m_Tree.GetRootItem();
if (m_Tree.ItemHasChildren(hRoot))
{
HTREEITEM hNextItem;
HTREEITEM hChildItem = m_Tree.GetChildItem(hRoot);

while (hChildItem != NULL)
{
if(m_Tree.ItemHasChildren(hChildItem)
{
HTREEITEM hGrandChildItem = m_Tree.GetChild(hChildItem);
HTREEITEM hGrandNextItem ;
while(hGrandChildItem != NULL)
{
***********;//对节点进行处理
hGrandNextItem = m_Tree.GetNextItem(hGrandItem,TVGN_NEXT);
hGrandChildItem = hGrandNextItem;
}
}
hNextItem = m_Tree.GetNextItem(hChildItem, TVGN_NEXT);
hChildItem = hNextItem;
}
}
遍历中用到递归,你可以将以上函数改成递归。
...全文
1827 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
jaynaviee 2012-03-03
  • 打赏
  • 举报
回复
很好!!!!!!!
bingying19872008 2011-12-08
  • 打赏
  • 举报
回复
尽量少用递归
cake_kingdom 2011-12-07
  • 打赏
  • 举报
回复
很有用 很有用 !!!!!!!
ld631714056 2011-07-19
  • 打赏
  • 举报
回复
学习了,谢谢楼主!
hnxtwf 2010-09-10
  • 打赏
  • 举报
回复
正在学习中..
youdaping777 2010-09-10
  • 打赏
  • 举报
回复
学习中,Up!
CXMTK 2010-08-30
  • 打赏
  • 举报
回复
正在研究、、
jijun1018 2010-06-18
  • 打赏
  • 举报
回复
嘿嘿
多谢了
很有用
lx_616_at_yeah_net 2010-06-18
  • 打赏
  • 举报
回复
非递归用队列,可能稍好一点,但还是不尽人意~
lx_616_at_yeah_net 2010-06-18
  • 打赏
  • 举报
回复
对递归和非递归用栈,一律无视~
zhuweiping2003 2010-06-18
  • 打赏
  • 举报
回复
我来说一句:
第一个函数 是深度优先遍历 是树的全遍历 采用的是递归的方法

第二个函数 是查找遍历 不是全遍历


然后 狂顶楼主。。。。支持一个哈
jijun1018 2010-06-18
  • 打赏
  • 举报
回复
很有用,支持一下
Eleven 2010-04-28
  • 打赏
  • 举报
回复
up....

1,649

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 非技术类
社区管理员
  • 非技术类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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