日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

c语言bfs程序讲解,面试算法--二叉树DFS/BFS实现(C语言)

發(fā)布時(shí)間:2023/12/10 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言bfs程序讲解,面试算法--二叉树DFS/BFS实现(C语言) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

深度優(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。