二叉樹的廣度搜索和深度搜索

這篇主要是記錄一下學習二叉樹的深度搜索和廣度搜索的學習過程,有問題希望大家多多指正。
首先,下圖是一顆二叉樹:
在這裏插入圖片描述
深度優先搜索(DFS):
深度優先搜索是從根節點出發,沿左子樹方向進行縱向遍歷,直到找到葉子結點爲止。然後回溯到前一個節點,進行右子樹節點的遍歷,直到遍歷完所有可達節點爲止。
遍歷順序:A B D E C F G
其實就是先遍歷根節點,再遍歷左子樹,最後遍歷右子樹,跟先序遍歷的過程是一樣的。
那我們要如何實現DFS算法呢?
這裏我們需要藉助一個我們很熟悉的數據結構,那就是棧
爲何要用棧呢?我們都知道棧是一種先進後出的數據結構,假如我們可以把二叉樹按照根節點,右孩子,左孩子的順序壓入棧中,然後依次出棧,這時候在用到遍歷讓左右孩子也都按照這個順序去進出棧,我們不就實現了DFS算法了麼,所以,請看代碼:

//stack所在的庫
#include <stack>
void DFSTree(Node * root)
{
//聲明一個棧,C++ STL庫
stack <Node*> nodeStack;
nodeStack.push(root);
//臨時指針變量
Node* node;
  while(!nodeStack.empty())
	{
	//獲取棧頂元素指針
	node = nodeStack.top();
	printf_s("%c",node->data);
	nodeStack.pop();
	if(node->rchild){nodeStack.push(node->rchild);}
	if(node->lchild){nodeStack.push(node->lchild);}
	}
}

廣度優先搜索(BFS):
廣度優先搜索是從根節點出發,在橫向遍歷二叉樹層段節點的基礎上縱向遍歷二叉樹的層次。
同樣是第一個圖,這時候其順序就是:
A B C D E F G
那又如何實現BFS呢?同樣我們要利用到一種數據結構隊列,其先進先出,所以我們可以用其很好的實現順序遍歷,根節點進隊,然後通過循環讓左子樹,右子樹進隊出隊即可。
實現如下:

void BFSTree(Node* root)
{
queue <Node*> nodeQueue;
nodeQueue.push(root);
node* node;
  while(!nodeQueue.empty())
	{
	node=nodeQueue.front();
	printf_s("%c",node->data);
	nodeQueue.pop();
	if(node->lchild){nodeQueue.push(node->lchild);}
	if(node->rchild){nodeQueue.push(node->rchild);}
	}

}

That’s All…

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