二叉树的深搜(DFS)与广搜(BFS)
轉(zhuǎn)載自: https://blog.csdn.net/u011613367/article/details/50950408
數(shù)據(jù)結(jié)構(gòu)中的有兩個比較重要的算法。深度優(yōu)先搜索和廣度優(yōu)先搜索。
二叉樹中的深度搜索就是對一個分支進(jìn)行遍歷,而廣搜就是一層一層的搜索。
下面通過代碼進(jìn)行講解:
注意:其實(shí)這代碼是不好的,主要是我為了讓main函數(shù)看著簡單一些把創(chuàng)建二叉樹的函數(shù)寫在main函數(shù)外面,不過不影響大家理解
首先要創(chuàng)建一棵二叉樹主要用了構(gòu)造函數(shù)知識,我想大家既然來看二叉樹了,C++至少應(yīng)該學(xué)了一些了(排除一些編程天才。。。)
假設(shè)大家已經(jīng)看懂了二叉樹的構(gòu)造,下面就是作者構(gòu)造的二叉樹
程序運(yùn)行結(jié)果
我們來講解今天的主題之深搜 先來看看深搜
深搜:10 8 5 1 2 6 3 4 9 7
廣搜:10 8 9 5 6 7 1 2 3 4
大家對照著圖結(jié)合開頭的幾句話來具體感受到底什么是深搜,什么是廣搜。
個人認(rèn)為必須要對廣搜和深搜之間的區(qū)別和這兩種算法的遍歷順序有一個概念,這樣看起代碼來應(yīng)該會很容易,大家可以結(jié)合我的gdb調(diào)試那篇文章來理解深搜。
不要嫌我啰嗦,說這么一大堆是想讓大家更好的理解代碼,如果上面的過程大家認(rèn)真做了話,看懂代碼是很容易的
深搜
PS:請準(zhǔn)備草稿紙,筆,在讀的時候畫一個棧圖,極其有幫助
首先main函數(shù)入棧,接著DFS函數(shù)入棧(參數(shù)為node10),顯然輸出10,接著判斷左邊的node8,發(fā)現(xiàn)滿足第一個if,于是DFS函數(shù)(node8)又進(jìn)棧了,于是輸出8,又滿足第一個if,于是DFS函數(shù)(node5)又入棧啦,輸出5,又滿足第一個if,于是DFS函數(shù)(node1)又入棧啦,輸出1,額,這次node1的left可不滿足第一個if,right也不滿足第二個if,啊哦,dfs(node1)就出棧了,于是棧頂變?yōu)閐fs(node5),剛才dfs(node5)只執(zhí)行了第一個if便被dfs(node1)壓住了,現(xiàn)在終于解脫了,開始判斷是否滿足第二個if,顯然滿足,于是dfs(node2)又進(jìn)棧了,dfs(node5)又被壓住了(人家可是還有return沒有執(zhí)行呢,好悲催)。。。 node2進(jìn)棧后輸出2,又開始進(jìn)行兩個if的判斷,顯然不滿足,于是return出棧了。啊啊啊,dfs(node5)終于可以return出棧了。
啊啊啊,想在終于輪到我dfs(node8)的天下了,終于可以開始判斷第二個if了,第二個if滿足,呃呃呃,dfs(node6)又入棧了。。。dfs(node8)又被壓住了(return還沒有執(zhí)行呢)。
過程就是這樣,不斷地出棧入棧直到最終dfs(node10)出棧。這時候棧里只剩下main函數(shù)了(后面詳細(xì)的進(jìn)棧入棧過程希望大家可以絲毫不差的推出來,千萬不能似懂非懂,模棱兩可)
bfs
void BFS(Node *Root) {queue<Node*> Q;Node * node ;Q.push(Root);while(!Q.empty()){node = Q.front();cout<<node->Value<<" ";if (node->Left!=NULL){Q.push(node->Left);}if (node->Right!=NULL){Q.push(node->Right);}Q.pop();}cout<<endl; }bfs主要是用隊(duì)列來實(shí)現(xiàn)的,如果把棧比作死胡同的話,那么隊(duì)列就是一條很窄的單行道
規(guī)則是先進(jìn)先出首先把讓node10入隊(duì),然后來一個while循環(huán)(不得不說程序設(shè)計中經(jīng)常用while循環(huán))只要這個隊(duì)列不為空,我就循環(huán)。
現(xiàn)在進(jìn)入單行道了(入隊(duì)了)迎面駛來的的node10,顯然先輸10,然后執(zhí)行兩個if判斷,全部成立,于是node8和node9又入隊(duì)了
現(xiàn)在隊(duì)中情況
node10 <- node8<- node9
然后node10駛出了單行道(q.pop();)于是迎面駛來node8,輸出8,然后滴滴,node5和node6又進(jìn)入單行道了現(xiàn)在隊(duì)中情況
node8<-node9<-node5<-node6
然后node8駛出了單行道(q.pop();)
就這樣不斷地駛?cè)牒婉偝?#xff0c;最終完成遍歷;
好啦,二叉樹就給大家講解到這里了,如果哪兒又不理解或者我的講解有錯誤的地方,歡迎在評論中告知,我會第一時間回復(fù)的。
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的二叉树的深搜(DFS)与广搜(BFS)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDU 1873 看病要排队(结构体+优
- 下一篇: 51nod1008 N的阶乘 mod P