c语言bfs程序讲解,面试算法--二叉树DFS/BFS实现(C语言)
深度優(yōu)先搜索算法(Depth First Search)
DFS是搜索算法的一種。它沿著樹(shù)的深度遍歷樹(shù)的節(jié)點(diǎn),盡可能深的搜索樹(shù)的分支。當(dāng)節(jié)點(diǎn)v的所有邊都己被探尋過(guò),搜索將回溯到發(fā)現(xiàn)節(jié)點(diǎn)v的那條邊的起始節(jié)點(diǎn)。這一過(guò)程一直進(jìn)行到已發(fā)現(xiàn)從源節(jié)點(diǎn)可達(dá)的所有節(jié)點(diǎn)為止。如果還存在未被發(fā)現(xiàn)的節(jié)點(diǎn),則選擇其中一個(gè)作為源節(jié)點(diǎn)并重復(fù)以上過(guò)程,整個(gè)進(jìn)程反復(fù)進(jìn)行直到所有節(jié)點(diǎn)都被訪問(wèn)為止。
圖片.png
如上圖所示的二叉樹(shù):
A 是第一個(gè)訪問(wèn)的,然后順序是 B、D,然后是 E。接著再是 C、F、G。那么,怎么樣才能來(lái)保證這個(gè)訪問(wèn)的順序呢?
分析一下,在遍歷了根結(jié)點(diǎn)后,就開(kāi)始遍歷左子樹(shù),最后才是右子樹(shù)。因此可以借助堆棧的數(shù)據(jù)結(jié)構(gòu),由于堆棧是后進(jìn)先出的順序,由此可以先將右子樹(shù)壓棧,然后再對(duì)左子樹(shù)壓棧,這樣一來(lái),左子樹(shù)結(jié)點(diǎn)就存在了棧頂上,因此某結(jié)點(diǎn)的左子樹(shù)能在它的右子樹(shù)遍歷之前被遍歷。
廣度優(yōu)先搜索算法(Breadth First Search)
又叫寬度優(yōu)先搜索,或橫向優(yōu)先搜索。是從根節(jié)點(diǎn)開(kāi)始,沿著樹(shù)的寬度遍歷樹(shù)的節(jié)點(diǎn)。如果所有節(jié)點(diǎn)均被訪問(wèn),則算法中止。
圖片.png
如上圖所示的二叉樹(shù),A 是第一個(gè)訪問(wèn)的,然后順序是 B、C,然后再是 D、E、F、G。那么,怎樣才能來(lái)保證這個(gè)訪問(wèn)的順序呢?
借助隊(duì)列數(shù)據(jù)結(jié)構(gòu),由于隊(duì)列是先進(jìn)先出的順序,因此可以先將左子樹(shù)入隊(duì),然后再將右子樹(shù)入隊(duì)。這樣一來(lái),左子樹(shù)結(jié)點(diǎn)就存在隊(duì)頭,可以先被訪問(wèn)到。
代碼實(shí)現(xiàn):
#include
#include
#include
using namespace std;
struct Node
{
int nVal;
Node *pLeft;
Node *pRight;
Node(int val,Node* left=NULL,Node * right=NULL):nVal(val),pLeft(left),pRight(right){}; //構(gòu)造
};
// 析構(gòu)
void DestroyTree(Node *pRoot)
{
if (pRoot==NULL)
return;
Node* pLeft=pRoot->pLeft;
Node* pRight=pRoot->pRight;
delete pRoot;
pRoot =NULL;
DestroyTree(pLeft);
DestroyTree(pRight);
}
// 用queue實(shí)現(xiàn)的BFS
void BFS(Node *pRoot)
{
if (pRoot==NULL)
return;
queue Q;
Q.push(pRoot);
while(!Q.empty())
{
Node *node = Q.front();
cout<nVal<";
if (node->pLeft!=NULL)
{
Q.push(node->pLeft);
}
if (node->pRight!=NULL)
{
Q.push(node->pRight);
}
Q.pop();
}
cout<
}
// DFS的遞歸實(shí)現(xiàn)
void DFS_Recursive(Node* pRoot)
{
if (pRoot==NULL)
return;
cout<nVal<
if (pRoot->pLeft!=NULL)
DFS_Recursive(pRoot->pLeft);
if (pRoot->pRight!=NULL)
DFS_Recursive(pRoot->pRight);
}
// DFS的迭代實(shí)現(xiàn)版本(stack)
void DFS_Iterative(Node* pRoot)
{
if (pRoot==NULL)
return;
stack S;
S.push(pRoot);
while (!S.empty())
{
Node *node=S.top();
cout<nVal<
S.pop();
if (node->pRight!=NULL)
{
S.push(node->pRight);
}
if (node->pLeft!=NULL)
{
S.push(node->pLeft);
}
}
}
// 打印樹(shù)的信息
void PrintTree(Node* pRoot)
{
if (pRoot==NULL)
return;
cout<nVal<
if (pRoot->pLeft!=NULL)
{
PrintTree(pRoot->pLeft);
}
if (pRoot->pRight!=NULL)
{
PrintTree(pRoot->pRight);
}
}
int main()
{
Node *node1=new Node(4);
Node *node2=new Node(5);
Node *node3=new Node(6);
Node* node4=new Node(2,node1,node2);
Node* node5=new Node(3,node3);
Node* node6=new Node(1,node4,node5);
Node* pRoot = node6;
//PrintTree(pRoot);
//DFS_Recursive(pRoot);
DFS_Iterative(pRoot);
DestroyTree(pRoot);
return 0;
}
總結(jié)
以上是生活随笔為你收集整理的c语言bfs程序讲解,面试算法--二叉树DFS/BFS实现(C语言)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 确认漏油 S级、大G均中招!奔驰打响下半
- 下一篇: 河北师范大学计算机应用技术分数线,201