精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

二叉樹的最小深度

算法與數(shù)據(jù)結(jié)構(gòu) ? 來源:代碼隨想錄 ? 作者:代碼隨想錄 ? 2022-04-28 16:27 ? 次閱讀

和求最大深度一個套路?

111.二叉樹的最小深度

題目地址:https://leetcode-cn.com/problems/minimum-depth-of-binary-tree/

給定一個二叉樹,找出其最小深度。

最小深度是從根節(jié)點到最近葉子節(jié)點的最短路徑上的節(jié)點數(shù)量。

說明:葉子節(jié)點是指沒有子節(jié)點的節(jié)點。

示例:

給定二叉樹[3,9,20,null,null,15,7],

27d8a3d6-c6a8-11ec-bce3-dac502259ad0.png

返回它的最小深度 2.

思路

看完了這篇104.二叉樹的最大深度,再來看看如何求最小深度。

直覺上好像和求最大深度差不多,其實還是差不少的。

遍歷順序上依然是后序遍歷(因為要比較遞歸返回之后的結(jié)果),但在處理中間節(jié)點的邏輯上,最大深度很容易理解,最小深度可有一個誤區(qū),如圖:

27ed27fc-c6a8-11ec-bce3-dac502259ad0.png

這就重新審題了,題目中說的是:最小深度是從根節(jié)點到最近葉子節(jié)點的最短路徑上的節(jié)點數(shù)量。,注意是葉子節(jié)點

什么是葉子節(jié)點,左右孩子都為空的節(jié)點才是葉子節(jié)點!

遞歸法

來來來,一起遞歸三部曲:

  1. 確定遞歸函數(shù)的參數(shù)和返回值

參數(shù)為要傳入的二叉樹根節(jié)點,返回的是int類型的深度。

代碼如下:

intgetDepth(TreeNode*node)
  1. 確定終止條件

終止條件也是遇到空節(jié)點返回0,表示當(dāng)前節(jié)點的高度為0。

代碼如下:

if(node==NULL)return0;
  1. 確定單層遞歸的邏輯

這塊和求最大深度可就不一樣了,一些同學(xué)可能會寫如下代碼:

intleftDepth=getDepth(node->left);
intrightDepth=getDepth(node->right);
intresult=1+min(leftDepth,rightDepth);
returnresult;

這個代碼就犯了此圖中的誤區(qū):

27ed27fc-c6a8-11ec-bce3-dac502259ad0.png

如果這么求的話,沒有左孩子的分支會算為最短深度。

所以,如果左子樹為空,右子樹不為空,說明最小深度是 1 + 右子樹的深度。

反之,右子樹為空,左子樹不為空,最小深度是 1 + 左子樹的深度。最后如果左右子樹都不為空,返回左右子樹深度最小值 + 1 。

代碼如下:

intleftDepth=getDepth(node->left);//左
intrightDepth=getDepth(node->right);//右
//中
//當(dāng)一個左子樹為空,右不為空,這時并不是最低點
if(node->left==NULL&&node->right!=NULL){
return1+rightDepth;
}
//當(dāng)一個右子樹為空,左不為空,這時并不是最低點
if(node->left!=NULL&&node->right==NULL){
return1+leftDepth;
}
intresult=1+min(leftDepth,rightDepth);
returnresult;

遍歷的順序為后序(左右中),可以看出:求二叉樹的最小深度和求二叉樹的最大深度的差別主要在于處理左右孩子不為空的邏輯。

整體遞歸代碼如下:

classSolution{
public:
intgetDepth(TreeNode*node){
if(node==NULL)return0;
intleftDepth=getDepth(node->left);//左
intrightDepth=getDepth(node->right);//右
//中
//當(dāng)一個左子樹為空,右不為空,這時并不是最低點
if(node->left==NULL&&node->right!=NULL){
return1+rightDepth;
}
//當(dāng)一個右子樹為空,左不為空,這時并不是最低點
if(node->left!=NULL&&node->right==NULL){
return1+leftDepth;
}
intresult=1+min(leftDepth,rightDepth);
returnresult;
}

intminDepth(TreeNode*root){
returngetDepth(root);
}
};

精簡之后代碼如下:

classSolution{
public:
intminDepth(TreeNode*root){
if(root==NULL)return0;
if(root->left==NULL&&root->right!=NULL){
return1+minDepth(root->right);
}
if(root->left!=NULL&&root->right==NULL){
return1+minDepth(root->left);
}
return1+min(minDepth(root->left),minDepth(root->right));
}
};

精簡之后的代碼根本看不出是哪種遍歷方式,所以依然還要強調(diào)一波:如果對二叉樹的操作還不熟練,盡量不要直接照著精簡代碼來學(xué)。

迭代法

相對于104.二叉樹的最大深度,本題還可以使用層序遍歷的方式來解決,思路是一樣的。

如果對層序遍歷還不清楚的話,可以看這篇:二叉樹:層序遍歷登場!

需要注意的是,只有當(dāng)左右孩子都為空的時候,才說明遍歷的最低點了。如果其中一個孩子為空則不是最低點

代碼如下:(詳細(xì)注釋)

classSolution{
public:

intminDepth(TreeNode*root){
if(root==NULL)return0;
intdepth=0;
queueque;
que.push(root);
while(!que.empty()){
intsize=que.size();
depth++;//記錄最小深度
for(inti=0;iif(node->left)que.push(node->left);
if(node->right)que.push(node->right);
if(!node->left&&!node->right){//當(dāng)左右孩子都為空的時候,說明是最低點的一層了,退出
returndepth;
}
}
}
returndepth;
}
};

其他語言版本

Java

classSolution{
/**
*遞歸法,相比求MaxDepth要復(fù)雜點
*因為最小深度是從根節(jié)點到最近**葉子節(jié)點**的最短路徑上的節(jié)點數(shù)量
*/
publicintminDepth(TreeNoderoot){
if(root==null){
return0;
}
intleftDepth=minDepth(root.left);
intrightDepth=minDepth(root.right);
if(root.left==null){
returnrightDepth+1;
}
if(root.right==null){
returnleftDepth+1;
}
//左右結(jié)點都不為null
returnMath.min(leftDepth,rightDepth)+1;
}
}
classSolution{
/**
*迭代法,層序遍歷
*/
publicintminDepth(TreeNoderoot){
if(root==null){
return0;
}
Dequedeque=newLinkedList<>();
deque.offer(root);
intdepth=0;
while(!deque.isEmpty()){
intsize=deque.size();
depth++;
for(inti=0;iif(poll.left==null&&poll.right==null){
//是葉子結(jié)點,直接返回depth,因為從上往下遍歷,所以該值就是最小值
returndepth;
}
if(poll.left!=null){
deque.offer(poll.left);
}
if(poll.right!=null){
deque.offer(poll.right);
}
}
}
returndepth;
}
}

Python

遞歸法:

classSolution:
defminDepth(self,root:TreeNode)->int:
ifnotroot:
return0
ifnotroot.leftandnotroot.right:
return1

min_depth=10**9
ifroot.left:
min_depth=min(self.minDepth(root.left),min_depth)#獲得左子樹的最小高度
ifroot.right:
min_depth=min(self.minDepth(root.right),min_depth)#獲得右子樹的最小高度
returnmin_depth+1

迭代法:

classSolution:
defminDepth(self,root:TreeNode)->int:
ifnotroot:
return0
que=deque()
que.append(root)
res=1

whileque:
for_inrange(len(que)):
node=que.popleft()
#當(dāng)左右孩子都為空的時候,說明是最低點的一層了,退出
ifnotnode.leftandnotnode.right:
returnres
ifnode.leftisnotNone:
que.append(node.left)
ifnode.rightisnotNone:
que.append(node.right)
res+=1
returnres
--- EOF ---

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 節(jié)點
    +關(guān)注

    關(guān)注

    0

    文章

    211

    瀏覽量

    24295
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4235

    瀏覽量

    61965
  • 二叉樹
    +關(guān)注

    關(guān)注

    0

    文章

    74

    瀏覽量

    12283

原文標(biāo)題:二叉樹的最小深度!

文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    指電極上覆蓋敏感材料的阻值計算

    覆蓋的敏感材料厚度超出指厚度時計算電阻,是否可以視作指電極指間電阻多個周期串聯(lián)后與超出指厚度部分敏感材料電阻并聯(lián)
    發(fā)表于 07-05 14:48

    指MOSFET器件靜電防護(hù)魯棒性提升技巧

    柵極接地NMOS是一種廣泛應(yīng)用的片上ESD器件結(jié)構(gòu),為達(dá)到特定ESD防護(hù)等級,一般會采用多指版圖形式來減小器件占用的芯片面積。但是,多指柵極接地NMOS在ESD應(yīng)力作用下,各個指難于做到均勻
    的頭像 發(fā)表于 06-22 00:50 ?359次閱讀
    多<b class='flag-5'>叉</b>指MOSFET器件靜電防護(hù)魯棒性提升技巧

    華睿科技近期推出新一代堆高式取型AMR FD150

    華睿科技近期推出新一代堆高式取型AMR FD150。FD150基于AMR專用車身設(shè)計,額定負(fù)載1500KG,最大舉升高度2m,滿足最小2.2m通道內(nèi)自主識別取放貨。
    的頭像 發(fā)表于 03-25 09:46 ?442次閱讀

    哈夫曼編碼怎么算 哈夫曼編碼左邊是0還是1

    二叉樹,將出現(xiàn)頻率高的字符用較短的編碼表示,而出現(xiàn)頻率低的字符則用較長的編碼表示。通過這種方式,可以實現(xiàn)對數(shù)據(jù)進(jìn)行高效的編碼和解碼。 下面我們將詳細(xì)介紹哈夫曼編碼的算法過程。 統(tǒng)計字符頻率 在進(jìn)行哈夫曼編碼前,首先需
    的頭像 發(fā)表于 01-30 11:27 ?2068次閱讀

    如何修改內(nèi)核設(shè)備

    如何修改內(nèi)核設(shè)備
    的頭像 發(fā)表于 12-14 14:06 ?677次閱讀
    如何修改內(nèi)核設(shè)備<b class='flag-5'>樹</b>

    堆的實現(xiàn)思路

    什么是堆? 堆是一種 基于樹結(jié)構(gòu)的數(shù)據(jù)結(jié)構(gòu),它是一棵二叉樹 ,具有以下兩個特點: 堆是一個完全二叉樹,即除了最后一層,其他層都是滿的,最后一層從左到右填滿。 堆中每個節(jié)點都滿足堆的特性,即父節(jié)點的值
    的頭像 發(fā)表于 11-24 16:02 ?331次閱讀
    堆的實現(xiàn)思路

    二叉樹的定義

    型結(jié)構(gòu) 是一類重要的 非線性數(shù)據(jù)結(jié)構(gòu) ,其中以二叉樹最為常用,直觀來看,是以分支關(guān)系定義的層次結(jié)構(gòu)。型結(jié)構(gòu)在客觀世界中廣泛存在,比
    的頭像 發(fā)表于 11-24 15:57 ?1034次閱讀
    <b class='flag-5'>樹</b>與<b class='flag-5'>二叉樹</b>的定義

    OP-TEE安全存儲安全文件的格式

    時,默認(rèn)情況下, 加密后的數(shù)據(jù)會被保存在/data/tee目錄中。 安全存儲功能使用 二叉樹的方式來 保存加密后的文件。 當(dāng)?shù)谝淮问褂冒踩鎯δ軇?chuàng)建用于保存敏感數(shù)據(jù)的安全文件時,OP-TEE將會在/data/tee目錄中生成兩個文件:dirf.db文件和以數(shù)字命名的文件。 dirf.db文
    的頭像 發(fā)表于 11-21 11:49 ?545次閱讀
    OP-TEE安全存儲安全文件的格式

    什么情況下需要布隆過濾器

    , gmail等郵箱垃圾郵件過濾功能 這幾個例子有一個共同的特點:如何判斷一個元素是否存在一個集合中? 常規(guī)思路 數(shù)組 鏈表 、平衡二叉樹、Trie Map (紅黑) 哈希表 雖然上面描述的這幾種數(shù)據(jù)結(jié)構(gòu)配合常見的排序、
    的頭像 發(fā)表于 11-11 11:37 ?552次閱讀
    什么情況下需要布隆過濾器

    紅黑的特點及應(yīng)用

    比起理解紅黑的原理,更重要的是理解紅黑的應(yīng)用場景,因為某些應(yīng)用場景的需要,紅黑才會應(yīng)運而生。 紅黑的特點: 插入,刪除,查找都是O(logn)的復(fù)雜度。 紅黑
    的頭像 發(fā)表于 11-10 11:16 ?609次閱讀
    紅黑<b class='flag-5'>樹</b>的特點及應(yīng)用

    為什么MySQL索引要用B+tree?

    紅黑是一種特化的 AVL(平衡二叉樹),都是在進(jìn)行插入和刪除操作時通過特定操作保持二叉查找的平衡; 若一棵
    發(fā)表于 10-30 14:41 ?170次閱讀

    深入理解線段:線段的區(qū)間修改與懶惰標(biāo)記

    標(biāo)在 i, j 里的最小 (大)值。也就是說:RMQ 問題是指求區(qū)間最值的問題。通常該類型題目的解法有遞歸分治、動態(tài)規(guī)劃、線段和單調(diào)棧 / 單調(diào)隊列。
    的頭像 發(fā)表于 10-13 11:06 ?521次閱讀
    深入理解線段<b class='flag-5'>樹</b>:線段<b class='flag-5'>樹</b>的區(qū)間修改與懶惰標(biāo)記

    文件系統(tǒng)-多二叉樹的轉(zhuǎn)化

    在這一節(jié)中,我們來學(xué)習(xí)如何使用程序來實現(xiàn)一棵文件。在上一節(jié)中,我們了解到使用文件的方式來整合計算機(jī)中所有的資源,而這一棵文件則是一棵多
    的頭像 發(fā)表于 10-11 10:06 ?768次閱讀
    文件系統(tǒng)-多<b class='flag-5'>叉</b><b class='flag-5'>樹</b>與<b class='flag-5'>二叉樹</b>的轉(zhuǎn)化

    數(shù)據(jù)結(jié)構(gòu)面試之二叉樹相關(guān)操作

    根據(jù)前序可知根結(jié)點為1; 根據(jù)中序可知 4 7 2 為根結(jié)點 1 的左子樹和 8 5 9 3 6 為根結(jié)點 1 的右子樹; 遞歸實現(xiàn),把 4 7 2 當(dāng)做新的一棵和 8 5 9 3 6 也當(dāng)做新的一棵; 在遞歸的過程中輸出后序。
    發(fā)表于 10-10 14:50 ?182次閱讀
    數(shù)據(jù)結(jié)構(gòu)面試之<b class='flag-5'>二叉樹</b>相關(guān)操作

    物聯(lián)網(wǎng)開發(fā)需要學(xué)習(xí)哪些內(nèi)容?

    和需要掌握的技能。 1. 物聯(lián)網(wǎng)軟件開發(fā)必備編程技術(shù): Linux C語言、數(shù)據(jù)結(jié)構(gòu) 核心技能內(nèi)容: 必備的Linux命令; C語言的基礎(chǔ)知識; C語言的數(shù)組、指針和函數(shù); 數(shù)據(jù)結(jié)構(gòu)中的線性表、棧和隊列用法及實現(xiàn); 二叉樹遞歸遍歷、層次遍歷、及非
    的頭像 發(fā)表于 10-09 17:23 ?1388次閱讀