二叉樹深度優先遍歷和廣度優先遍歷


  對於一顆二叉樹,深度優先搜索(Depth First Search)是沿着樹的深度遍歷樹的節點,盡可能深的搜索樹的分支。以上面二叉樹為例,深度優先搜索的順序

為:ABDECFG。怎么實現這個順序呢 ?深度優先搜索二叉樹是先訪問根結點,然后遍歷左子樹接着是遍歷右子樹,因此我們可以利用堆棧的先進后出的特點,

現將右子樹壓棧,再將左子樹壓棧,這樣左子樹就位於棧頂,可以保證結點的左子樹先與右子樹被遍歷。

  廣度優先搜索(Breadth First Search),又叫寬度優先搜索或橫向優先搜索,是從根結點開始沿着樹的寬度搜索遍歷,上面二叉樹的遍歷順序為:ABCDEFG.

可以利用隊列實現廣度優先搜索。

  下面給出二叉樹dfs和bfs的具體代碼:

#include <vector>
#include <iostream>
#include <stack>
#include <queue>
using namespace std;

struct BitNode
{
int data;
BitNode *left, *right;
BitNode(int x) :data(x), left(0), right(0){}
};

void Create(BitNode *&root)
{
int key;
cin >> key;
if (key == -1)
root = NULL;
else
{
root = new BitNode(key);
Create(root->left);
Create(root->right);
}
}

void PreOrderTraversal(BitNode *root)
{
if (root)
{
cout << root->data << " ";
PreOrderTraversal(root->left);
PreOrderTraversal(root->right);
}
}

//深度優先搜索
//利用棧,現將右子樹壓棧再將左子樹壓棧
void DepthFirstSearch(BitNode *root)
{
stack<BitNode*> nodeStack;
nodeStack.push(root);
while (!nodeStack.empty())
{
BitNode *node = nodeStack.top();
cout << node->data << ' ';
nodeStack.pop();
if (node->right)
{
nodeStack.push(node->right);
}
if (node->left)
{
nodeStack.push(node->left);
}
}
}

//廣度優先搜索
void BreadthFirstSearch(BitNode *root)
{
queue<BitNode*> nodeQueue;
nodeQueue.push(root);
while (!nodeQueue.empty())
{
BitNode *node = nodeQueue.front();
cout << node->data << ' ';
nodeQueue.pop();
if (node->left)
{
nodeQueue.push(node->left);
}
if (node->right)
{
nodeQueue.push(node->right);
}
}
}

int main()
{
BitNode *root = NULL;
Create(root);
//前序遍歷
PreOrderTraversal(root);
//深度優先遍歷
cout << endl << "dfs" << endl;
DepthFirstSearch(root);
//廣度優先搜索
cout << endl << "bfs" << endl;
BreadthFirstSearch(root);
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM