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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[Leetcode][第111题][JAVA][BFS][二叉树的最小深度][BFS][递归]

發(fā)布時(shí)間:2023/12/10 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Leetcode][第111题][JAVA][BFS][二叉树的最小深度][BFS][递归] 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

【問題描述】[簡單]

【解答思路】

1. 遞歸

自下而上
基本情況/結(jié)束條件 :
葉子節(jié)點(diǎn)的定義是左孩子和右孩子都為 null 時(shí)叫做葉子節(jié)點(diǎn)
當(dāng) root 節(jié)點(diǎn)左右孩子都為空時(shí),返回 1
當(dāng) root 節(jié)點(diǎn)左右孩子有一個(gè)為空時(shí),返回不為空的孩子節(jié)點(diǎn)的深度
當(dāng) root 節(jié)點(diǎn)左右孩子都不為空時(shí),返回左右孩子較小深度的節(jié)點(diǎn)值

遞推關(guān)系:遍歷二叉樹

復(fù)雜度

class Solution {public int minDepth(TreeNode root) {if(root == null) return 0;//這道題遞歸條件里分為三種情況//1.左孩子和有孩子都為空的情況,說明到達(dá)了葉子節(jié)點(diǎn),直接返回1即可if(root.left == null && root.right == null) return 1;//2.如果左孩子和由孩子其中一個(gè)為空,那么需要返回比較大的那個(gè)孩子的深度 int m1 = minDepth(root.left);int m2 = minDepth(root.right);//這里其中一個(gè)節(jié)點(diǎn)為空,說明m1和m2有一個(gè)必然為0,所以可以返回m1 + m2 + 1;if(root.left == null || root.right == null) return m1 + m2 + 1;//3.最后一種情況,也就是左右孩子都不為空,返回最小深度+1即可return Math.min(m1,m2) + 1; } }

代碼可以進(jìn)行簡化,當(dāng)左右孩子為空時(shí) m1和 m2 都為 0,可以和情況 2 進(jìn)行合并,即返回 m1+m2+1

class Solution {public int minDepth(TreeNode root) {if(root == null) return 0;int m1 = minDepth(root.left);int m2 = minDepth(root.right);//1.如果左孩子和右孩子有為空的情況,直接返回m1+m2+1//2.如果都不為空,返回較小深度+1return root.left == null || root.right == null ? m1 + m2 + 1 : Math.min(m1,m2) + 1;} } class Solution {public int minDepth(TreeNode root) {if (root == null) {return 0;}if ((root.left == null) && (root.right == null)) {return 1;}int min_depth = Integer.MAX_VALUE;if (root.left != null) {min_depth = Math.min(minDepth(root.left), min_depth);}if (root.right != null) {min_depth = Math.min(minDepth(root.right), min_depth);}return min_depth + 1;} }
2. BFS廣度優(yōu)先遍歷

一個(gè)優(yōu)化的方法是利用廣度優(yōu)先搜索,我們按照樹的層去迭代,第一個(gè)訪問到的葉子就是最小深度的節(jié)點(diǎn),這樣就不用遍歷所有的節(jié)點(diǎn)了。
1.特判
2.root入隊(duì) ,左右節(jié)點(diǎn)非空入隊(duì)
3.找到第一個(gè)左右節(jié)點(diǎn)均為空的節(jié)點(diǎn)即是答案

時(shí)間復(fù)雜度:O(N) 空間復(fù)雜度:O(N)

public int minDepth(TreeNode root) {if (root == null)return 0;Queue<TreeNode> queue = new LinkedList<>();queue.add(root);//入隊(duì)int level = 0;while (!queue.isEmpty()) {//隊(duì)列不為空就繼續(xù)循環(huán)level++;int levelCount = queue.size();for (int j = 0; j < levelCount; j++) {TreeNode node = queue.poll();//出隊(duì)//如果當(dāng)前node節(jié)點(diǎn)的左右子樹都為空,直接返回level即可if (node.left == null && node.right == null)return level;if (node.left != null)queue.add(node.left);if (node.right != null)queue.add(node.right);}}return -1;}

【總結(jié)】

1. 相關(guān)題目

[Leetcode][第104題][JAVA][二叉樹的最大深度][遞歸][BFS]

2.遞歸

在實(shí)現(xiàn)遞歸函數(shù)之前,有兩件重要的事情需要弄清楚:

遞推關(guān)系:一個(gè)問題的結(jié)果與其子問題的結(jié)果之間的關(guān)系。
基本情況:不需要進(jìn)一步的遞歸調(diào)用就可以直接計(jì)算答案的情況。可理解為遞歸跳出條件。
一旦我們計(jì)算出以上兩個(gè)元素,再想要實(shí)現(xiàn)一個(gè)遞歸函數(shù),就只需要根據(jù)遞推關(guān)系調(diào)用函數(shù)本身,直到其抵達(dá)基本情況。

3.遞歸模板套路

遞歸模板套路
由下到上

有上到下

區(qū)別

參考鏈接:https://leetcode-cn.com/problems/minimum-depth-of-binary-tree/solution/li-jie-zhe-dao-ti-de-jie-shu-tiao-jian-by-user7208/
參考鏈接:https://leetcode-cn.com/problems/minimum-depth-of-binary-tree/solution/java-di-gui-he-fei-di-gui-liang-chong-fang-shi-de-/
遞歸學(xué)習(xí)資料:https://leetcode-cn.com/circle/article/koSrVI/

總結(jié)

以上是生活随笔為你收集整理的[Leetcode][第111题][JAVA][BFS][二叉树的最小深度][BFS][递归]的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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