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

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

生活随笔

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

编程问答

深度优先和广度优先算法(例题)

發(fā)布時(shí)間:2023/12/31 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深度优先和广度优先算法(例题) 小編覺(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é)果。
代碼如下:

/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val = x; }* }*/ 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();/*關(guān)鍵點(diǎn)如果節(jié)點(diǎn)為空就去找他的根節(jié)點(diǎn)的左節(jié)點(diǎn),如果還為空返回上一級(jí)去找,如此循環(huán),直到全部出棧*/if (node != null) {max_depth = Math.max(max_depth, depth);/*判定這個(gè)map里是否有這個(gè)key的值*/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去接受map里的value的值*/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)。
代碼如下:

/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val = x; }* }*/ class Solution {public List<Integer> rightSideView(TreeNode root) {//這個(gè)和二叉樹(shù)的層序遍歷區(qū)別在于,只需要保存最右邊的TreeNode即可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) {/*關(guān)鍵點(diǎn)如果是這一層的最后一個(gè)就輸出他*/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ò),歡迎將生活随笔推薦給好友。