【二叉樹遍歷算法】——廣/深度優先搜索的實現

廣度和深度優先搜索一般都是用於圖的遍歷,樹也有,這裏實現的是二叉樹的廣度和深度優先搜索。主要使用僞代碼的方式實現,掌握基本的思想和過程即可,對應具體的編程語言實現起來也就大同小異了。

深度優先搜索

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);
	}
}

下面是我的理解和記住實現過程的幾個技巧:

  • 深度優先使用的是棧,因爲涉及到回溯的問題;而廣度優先使用的是隊列,相當於每層從左到右逐個進入隊列。
  • 深度優先是根節點先進棧,其次每次彈棧的時候,先訪問該棧頂結點,讓右孩子先進棧,再讓左孩子進棧,原因是棧是先進後出的,循環處理。
  • 廣度優先是根節點先進隊列,其次都把出隊的結點的左孩子和右孩子依次添加到隊列中,直到隊列爲空。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章