数据结构中对于树结构的节点遍历方式有深度优先和广度优先两种方法,其中广度优先也叫作层序遍历。在具体的代码实现中,深度优先算法采用的是递归算法,需要使用到栈这种数据结构;而广度优先采用的是非递归算法,需要用到队列这种数据结构;如果你之前对这两种方式有所了解的话那到这里你就已经知道我说的细节了,如果没有了解过,也没关系,可以直接看下面的代码,可以获取到更直接的感受和理解。
因为Windows目录结构的组织其实也就是一棵树,这里以对Windows目录的遍历作为Demo来演示这两种遍历方式。
第一种方式:深度优先方式(DFS)。
/**********************************
函数名称:TravelPathByDFS
功 能:深度优先遍历(DFS)指定路径
参 数:lpPath:要遍历的起始路径
IsRecursive:是否递归遍历(TRUE:递归遍历,FALSE:非递归遍历)
返 回 值:VOID
备 注:无
***********************************/
VOID TravelPathByDFS(CONST TCHAR* lpPath, BOOL IsRecursive)
{
HANDLE hFindFile = INVALID_HANDLE_VALUE;
WIN32_FIND_DATA tagFindData = {0};
TCHAR szPath[BUFFER_SIZE] = {TEXT('\0')};
TCHAR szTemp[BUFFER_SIZE] = {TEXT('\0')};
if(NULL == lpPath || lstrlen(lpPath) > (BUFFER_SIZE - 1))
{
return;
}//end if(NULL == lpPath || lstrlen(lpPath) > (BUFFER_SIZE - 1))
memset(szPath, 0, sizeof(szPath));
lstrcpy(szPath, lpPath);
if(TEXT('\\') != szPath[lstrlen(szPath) - 1])
{
szPath[lstrlen(szPath)] = TEXT('\\');
}//end if(TEXT('\\') != szPath[lstrlen(szPath) - 1])
lstrcat(szPath, TEXT("*.*"));
if((hFindFile = ::FindFirstFile(szPath, &tagFindData)) == INVALID_HANDLE_VALUE)
{
return;
}//end if((hFindFile = ::FindFirstFile(szPath, &tagFindData)) == INVALID_HANDLE_VALUE)
do
{
//首先排除掉