void CxxxDlg::TreeVisit(CTreeCtrl& tree, HTREEITEM hItem) 
{   
    AfxMessageBox(tree.GetItemText(hItem));  
if (tree.ItemHasChildren(hItem))  
{//有子项 
HTREEITEM hChildItem = tree.GetChildItem(hItem);  
while(hChildItem != NULL)  
{  
TreeVisit(tree, hChildItem); //递归遍历子节点  
hChildItem = tree.GetNextItem(hChildItem, TVGN_NEXT);  
}  
}  
else//关键是这里这个else里面怎么写
{//没有子项
HTREEITEM hRootItem = tree.GetNextSiblingItem(hItem);   if (hRootItem != NULL)  
{  
TreeVisit(tree, hRootItem); //递归遍历根节点  
hRootItem = tree.GetNextItem(hRootItem, TVGN_NEXT);  
}  
}
} 上面的代码,如果树结点都是根结点,如下:
根1
根2
根3
那么可以输出“根1” “根2” “根3”但如果树是下面的形式,有三个根,第一个根下有两个子结点。
根1
--子1
--子2
根2
根3
那么就只能输出“根1” “子1” “子2” ,而“根2”和“根3”无法遍历输出。==============求高手改错,帮忙改下上面的代码,使其可以遍历所有的树的结点。

解决方案 »

  1.   

    // CTreeCtrlFind message handlers /* 如果T是一棵空树,那么对T进行前序遍历、中序遍历和后序遍历都是空操作,得到的列表为空表。 如果T是一棵单结点树,那么对T进行前序遍历、中序遍历和后序遍历都只访问这个结点。这个结点本身就是要得到的相应列表。 否则,设它以n为树根,树根的子树从左到右依次为T1,T2,..,Tk,那么有: 对T进行前序遍历是先访问树根n,然后依次前序遍历T1,T2,..,Tk。 对T进行中序遍历是先中序遍历T1,然后访问树根n,接着依次对T2,T2,..,Tk进行中序遍历。 对T进行后序遍历是先依次对T1,T2,..,Tk进行后序遍历,最后访问树根n。 */ /*************************************************************** * * 名称:FindItem * * 功能:在树控制中根据数据项名称查找数据项 * * 参数:item - 要查询的数据项及其子数据项 * * strText - 要查询的数据项名称 * * 返回值:NULL - 没找到 * * (非空的HTREEITEM ) - 找到 * 先序遍历 * ***************************************************************/ HTREEITEM CTreeCtrlFind::PreorderFindItem(HTREEITEM item, CString strText) { HTREEITEM hFind; if (!item) return NULL; CString strTemp = GetItemText(item); if (GetItemText(item) == strText) //"root" node return item; if (ItemHasChildren(item)) { item = GetChildItem(item); //"first" tree while (item != NULL) { hFind = PreorderFindItem(item, strText); if (hFind) return hFind; else item = GetNextSiblingItem(item); } return NULL; } else //leaf node return NULL; } HTREEITEM CTreeCtrlFind::PreorderFindItem(HTREEITEM item, DWORD dwItem) { HTREEITEM hFind; if (!item) return NULL; if (GetItemData(item) == dwItem) //"root" node return item; if (ItemHasChildren(item)) { item = GetChildItem(item); while (item != NULL) { hFind = PreorderFindItem(item, dwItem); if (hFind) return hFind; else item = GetNextSiblingItem(item); } return NULL; } else return NULL; } HTREEITEM CTreeCtrlFind::Preorder2FindItem(HTREEITEM item, CString strText) { HTREEITEM hFind; if (!item) return NULL; CString strTemp = GetItemText(item); if (GetItemText(item) == strText) //"root" node return item; item = GetChildItem(item); //"first" tree while (item != NULL) { hFind = PreorderFindItem(item, strText); if (hFind) return hFind; else item = GetNextSiblingItem(item); //"other" trees } return NULL; } HTREEITEM CTreeCtrlFind::Preorder2FindItem(HTREEITEM item, DWORD dwItem) { HTREEITEM hFind; if (!item) return NULL; if (GetItemData(item) == dwItem) //"root" node return item; item = GetChildItem(item); //"first" tree while (item != NULL) { hFind = PreorderFindItem(item, dwItem); if (hFind) return hFind; else item = GetNextSiblingItem(item); //"other" trees } return NULL; } HTREEITEM CTreeCtrlFind::InorderFindItem(HTREEITEM item, CString strText) { HTREEITEM hFind; if (!item) return NULL; if (ItemHasChildren(item)) { HTREEITEM v = item; item = GetChildItem(item); hFind = InorderFindItem(item, strText); if (hFind) return hFind; if (GetItemText(v) == strText) return v; item = GetNextSiblingItem(item); while (item != NULL) { hFind = InorderFindItem(item, strText); if (hFind) return hFind; else item = GetNextSiblingItem(item); } return NULL; } else { if (GetItemText(item) == strText) return item; else return NULL; } } HTREEITEM CTreeCtrlFind::InorderFindItem(HTREEITEM item, DWORD dwItem) { HTREEITEM hFind; if (!item) return NULL; if (!ItemHasChildren(item)) { if (GetItemData(item) == dwItem) return item; else return NULL; } else { HTREEITEM v; v = item; item = GetChildItem(item); hFind = InorderFindItem(item, dwItem); if (hFind) return hFind; if (GetItemData(v) == dwItem) return v; item = GetNextSiblingItem(item); while (item != NULL) { hFind = InorderFindItem(item, dwItem); if (hFind) return hFind; else item = GetNextSiblingItem(item); } return NULL; } } HTREEITEM CTreeCtrlFind::Inorder2FindItem(HTREEITEM item, CString strText) { HTREEITEM hFind; HTREEITEM v, child; if (!item) return NULL; v = item; child = GetChildItem(item); if (child) { hFind = InorderFindItem(child, strText); if (hFind) return hFind; } if (GetItemText(v) == strText) return v; if (child) { item = GetNextSiblingItem(child); while (item != NULL) { hFind = InorderFindItem(item, strText); if (hFind) return hFind; else item = GetNextSiblingItem(item); } } return NULL; } HTREEITEM CTreeCtrlFind::Inorder2FindItem(HTREEITEM item, DWORD dwItem) { HTREEITEM hFind, v, child; if (!item) return NULL; v = item; child = GetChildItem(item); if (child) { hFind = InorderFindItem(child, dwItem); if (hFind) return hFind; } if (GetItemData(v) == dwItem) return v; if (child) { item = GetNextSiblingItem(child); while (item != NULL) { hFind = InorderFindItem(item, dwItem); if (hFind) return hFind; else item = GetNextSiblingItem(item); } } return NULL; } HTREEITEM CTreeCtrlFind::PostorderFindItem(HTREEITEM item, CString strText) { HTREEITEM hFind; if (!item) return NULL; if (ItemHasChildren(item)) { HTREEITEM v; v = item; item = GetChildItem(item); while (item != NULL) { hFind = PostorderFindItem(item, strText); if (hFind) return hFind; else item = GetNextSiblingItem(item); } if (GetItemText(v) == strText) return v; return NULL; } else { if (GetItemText(item) == strText) return item; else return NULL; } } HTREEITEM CTreeCtrlFind::PostorderFindItem(HTREEITEM item, DWORD dwItem) { HTREEITEM hFind; if (!item) return NULL; if (!ItemHasChildren(item)) { if (GetItemData(item) == dwItem) return item; else return NULL; } else { HTREEITEM v; v = item; item = GetChildItem(item); while (item != NULL) { hFind = PostorderFindItem(item, dwItem); if (hFind) return hFind; else item = GetNextSiblingItem(item); } if (GetItemData(v) == dwItem) return v; return NULL; } } HTREEITEM CTreeCtrlFind::Postorder2FindItem(HTREEITEM item, CString strText) { HTREEITEM hFind; HTREEITEM v; if (!item) return NULL; v = item; item = GetChildItem(item); while (item != NULL) { hFind = PostorderFindItem(item, strText); if (hFind) return hFind; else item = GetNextSiblingItem(item); } if (GetItemText(v) == strText) return v; return NULL; } HTREEITEM CTreeCtrlFind::Postorder2FindItem(HTREEITEM item, DWORD dwItem) { HTREEITEM hFind; HTREEITEM v; if (!item) return NULL; v = item; item = GetChildItem(item); while (item != NULL) { hFind = PostorderFindItem(item, dwItem); if (hFind) return hFind; else item = GetNextSiblingItem(item); } if (GetItemData(v) == dwItem) return v; return NULL; } HTREEITEM CTreeCtrlFind::FindItem(HTREEITEM item, CString strText) { HTREEITEM v = GetNextSiblingItem(NULL); return Preorder2FindItem(item, strText); } HTREEITEM CTreeCtrlFind::FindItem(HTREEITEM item, DWORD dwItem) { return PreorderFindItem(item, dwItem); } 
      

  2.   

    void CFileManage::BrowseLocalDir( CString strDir, HTREEITEM parent )//遍历并显示系统中的各种格式的文件
    {
    CCeFileFind find;//CCeFileFind 为自绘类,需要的话可以联系我
    CString szDir = strDir;
    HTREEITEM hSubItem;
    if(szDir.Right(1) != "\\")
    {
    szDir += "\\";
    }
    szDir += "*.*";
    BOOL res = find.FindFile(szDir);
    while(res )
    {
    res = find.FindNextFile();
    if(find.IsDirectory() && !find.IsDots())
    {
    CString strPath = find.GetFilePath();
    CString strTitle = find.GetFileName();
    hSubItem =TreeLocalFile.InsertItem( strTitle,1,1,parent );
    BrowseLocalDir(strPath, hSubItem );
    }
    else if(!find.IsDirectory() && !find.IsDots())
    {
    CString strTitle = find.GetFileName();
    HTREEITEM hh = TreeLocalFile.InsertItem( strTitle, 0,0,parent );
    }
    }
    find.Close();
    }