MFC CTreeCtrl类的结点遍历查找

 

转载源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) 

 }

 

 

 

你可能感兴趣的:(MFC CTreeCtrl类的结点遍历查找)