转载源url不记得了。
CTreeCtrl类的结点遍历查找
1:声名函数原型, HTREEITEM finditem(CTreeCtrl &tree, HTREEITEM startitem, CString strText)
处理流理:
2:定义一个树结点返回值. HTREEITEM rstItem = NULL;
3:首先判断 startitem是否为NULL,如果为NULL的话就返回 if(startitem==NULL) return;
5:如果以上条件都不成立就进入循环_循环条件为startitem不等与NULL,while(startitem != NULL)
6:判断要查找的strText是不是和startitem结点的text相等 if(tree->getitemtext(startitem)==strText) return startitem;
7:首先判断该结点是否有子节点,如果有子节点就先递归查询子节点,否则就查询该节点的兄弟结点。
if( tree->gethaschildren(startitem) )
{
//递归查找子节点
//获取当前节点的子节点
startitem = tree->getchilditem(startitem);
//递归遍历查找子节点上的内容
rstItem = finditem(tree, startitem, strText);
//判断递归的返回值是否为NULL,如果不为NULL的话就表示在子节点中找到了该节点项并返回结点
if(rstItem != NULL)
{ return rstItem; }
else
{
//如果子节点上没有找到和strText内容相等的内容,
//那么就反回到当前结点的兄弟节点上继续返回while处循环查找。
startitem = tree->getnextsublingitem(tree->getParentItem(startitem));
}
}
else
{
//将其下一个兄弟节点做为下个循环查找的起始节点
startitem = tree->getnextsiblingitem(startitem);
}
根具以下流程思路编程算法编写源码:
HTREEITEM finditem(CTreeCtrl &tree, HTREEITEM startItem, CString strText)
{
HTREEITEM rstItem;
if( startItem == NULL ){ return NULL; }
while(startItem != NULL)
{
if(tree->GetItemText(startItem) == strText) { return startItem; }
if(tree->GetHasChildren(startItem))
{
startItem = tree->GetChildItem(startItem);
rstItem = finditem(tree, startItem, strText);
if(rstItem != NULL)
{
return rstItem;
}
else
{
startItem = tree->GetNextSiblingItem(tree->GetParentItem(startItem));
}
}
else
{
startItem = tree->GetNextSiblingItem(startItem);
}//end if(tree->GetHasChildren(startItem))
}//end while(startItem != NULL)
}