生活随笔
收集整理的這篇文章主要介紹了
深度优先和广度优先算法(例题)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在LeetCode上面刷題刷到一道二叉樹(shù)的題,這道題我認(rèn)為對(duì)學(xué)習(xí)樹(shù)的深度優(yōu)先和廣度優(yōu)先算法有一定的幫助,先來(lái)看一下題
這道題是這樣的:
給定一棵二叉樹(shù),想象自己站在它的右側(cè),按照從頂部到底部的順序,返回從右側(cè)所能看到的節(jié)點(diǎn)值。
這道題有兩種思路一種是深度優(yōu)先一種是廣度優(yōu)先
深度優(yōu)先
見(jiàn)名知意這種思路就是先從深度遍歷,我們先去往深處遍歷,由于這道題是尋找每一層最右面的值,我們可以總是先訪問(wèn)右子樹(shù)。這樣就保證了當(dāng)我們?cè)L問(wèn)樹(shù)的某個(gè)特定深度時(shí),我們正在訪問(wèn)的節(jié)點(diǎn)總是該深度的最右側(cè)節(jié)點(diǎn)。于是,可以存儲(chǔ)在每個(gè)深度訪問(wèn)的第一個(gè)結(jié)點(diǎn),一旦我們知道了樹(shù)的層數(shù),就可以得到最終的結(jié)果。
代碼如下:
class Solution {public List
<Integer> rightSideView(TreeNode root
) {Map
<Integer, Integer> map
= new HashMap<Integer, Integer>();int max_depth
= -1;Stack
<TreeNode> nodeStack
= new Stack<TreeNode>();Stack
<Integer> depthStack
= new Stack<Integer>();nodeStack
.push(root
);depthStack
.push(0);while (!nodeStack
.isEmpty()) {TreeNode node
= nodeStack
.pop();int depth
= depthStack
.pop();if (node
!= null
) {max_depth
= Math
.max(max_depth
, depth
);if (!map
.containsKey(depth
)) {map
.put(depth
, node
.val
);}nodeStack
.push(node
.left
);nodeStack
.push(node
.right
);depthStack
.push(depth
+1);depthStack
.push(depth
+1);}}List
<Integer> rightView
= new ArrayList<Integer>();for (int depth
= 0; depth
<= max_depth
; depth
++) {rightView
.add(map
.get(depth
));}return rightView
;}
}
廣度優(yōu)先
同樣很容易看到這個(gè)詞的1意思,就是從寬度下手,跟深度優(yōu)先正好相反,每一層每一層的去遍歷,直到最后一層,我們對(duì)每一層都從左到右訪問(wèn)。因此,通過(guò)只保留每個(gè)深度最后訪問(wèn)的結(jié)點(diǎn),我們就可以在遍歷完整棵樹(shù)后得到每個(gè)深度最右的結(jié)點(diǎn)。
代碼如下:
class Solution {public List
<Integer> rightSideView(TreeNode root
) {List
<Integer>list
=new ArrayList<Integer>();if(root
==null
)return list
;int level
=0;Queue
<TreeNode> queue
= new LinkedList<TreeNode>();queue
.add(root
);while ( !queue
.isEmpty() ) {int level_length
= queue
.size();for(int i
= 0; i
< level_length
; ++i
) {if(i
==level_length
-1){list
.add(queue
.peek().val
);}TreeNode node
= queue
.remove();if (node
.left
!= null
) queue
.add(node
.left
);if (node
.right
!= null
) queue
.add(node
.right
); }level
++;}return list
;}
}
上面是這個(gè)題的兩種解法,一個(gè)使用的是棧一個(gè)使用的是隊(duì)列,分別應(yīng)用了棧后入先出的特向和隊(duì)列先進(jìn)先出的特性,上面的關(guān)鍵點(diǎn)已經(jīng)標(biāo)出,只要花時(shí)間就可以看懂,這道題難度不高,我認(rèn)為可能對(duì)DFS和BFS有一定的理解
總結(jié)
以上是生活随笔為你收集整理的深度优先和广度优先算法(例题)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。