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;   
        }   
  }   
  遍历中用到递归,你可以将以上函数改成递归。