廣度和深度優先搜索一般都是用於圖的遍歷,樹也有,這裏實現的是二叉樹的廣度和深度優先搜索。主要使用僞代碼的方式實現,掌握基本的思想和過程即可,對應具體的編程語言實現起來也就大同小異了。
深度優先搜索
void depthSearch(BiTree T){
InitStack(S);
Push(S,T)
while(!StackEmpty(S)){
Pop(S,p);
visit(p);
if(p->rChild)
Push(S,p->rChild);
if(p->lChild)
Push(S,p->lChild);
}
}
廣度優先搜索
void breathSearch(BiTree T){
InitQueue(Q);
Push(Q,T);
while(!QueueEmpty(Q)){
Pop(Q,p);
visit(p);
if(p->lChild)
Push(Q,p->lChild);
if(p->rChild)
Push(Q,p->rChild);
}
}
下面是我的理解和記住實現過程的幾個技巧:
- 深度優先使用的是棧,因爲涉及到回溯的問題;而廣度優先使用的是隊列,相當於每層從左到右逐個進入隊列。
- 深度優先是根節點先進棧,其次每次彈棧的時候,先訪問該棧頂結點,讓右孩子先進棧,再讓左孩子進棧,原因是棧是先進後出的,循環處理。
- 廣度優先是根節點先進隊列,其次都把出隊的結點的左孩子和右孩子依次添加到隊列中,直到隊列爲空。