在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

二叉樹的最小深度

算法與數據結構 ? 來源:代碼隨想錄 ? 作者:代碼隨想錄 ? 2022-04-28 16:27 ? 次閱讀

和求最大深度一個套路?

111.二叉樹的最小深度

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

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

最小深度是從根節點到最近葉子節點的最短路徑上的節點數量。

說明:葉子節點是指沒有子節點的節點。

示例:

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

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

返回它的最小深度 2.

思路

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

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

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

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

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

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

遞歸法

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

  1. 確定遞歸函數的參數和返回值

參數為要傳入的二叉樹根節點,返回的是int類型的深度。

代碼如下:

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

終止條件也是遇到空節點返回0,表示當前節點的高度為0。

代碼如下:

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

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

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

這個代碼就犯了此圖中的誤區:

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

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

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

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

代碼如下:

intleftDepth=getDepth(node->left);//左
intrightDepth=getDepth(node->right);//右
//中
//當一個左子樹為空,右不為空,這時并不是最低點
if(node->left==NULL&&node->right!=NULL){
return1+rightDepth;
}
//當一個右子樹為空,左不為空,這時并不是最低點
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);//右
//中
//當一個左子樹為空,右不為空,這時并不是最低點
if(node->left==NULL&&node->right!=NULL){
return1+rightDepth;
}
//當一個右子樹為空,左不為空,這時并不是最低點
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));
}
};

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

迭代法

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

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

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

代碼如下:(詳細注釋)

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){//當左右孩子都為空的時候,說明是最低點的一層了,退出
returndepth;
}
}
}
returndepth;
}
};

其他語言版本

Java

classSolution{
/**
*遞歸法,相比求MaxDepth要復雜點
*因為最小深度是從根節點到最近**葉子節點**的最短路徑上的節點數量
*/
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;
}
//左右結點都不為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){
//是葉子結點,直接返回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()
#當左右孩子都為空的時候,說明是最低點的一層了,退出
ifnotnode.leftandnotnode.right:
returnres
ifnode.leftisnotNone:
que.append(node.left)
ifnode.rightisnotNone:
que.append(node.right)
res+=1
returnres
--- EOF ---

審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 節點
    +關注

    關注

    0

    文章

    220

    瀏覽量

    24451
  • 函數
    +關注

    關注

    3

    文章

    4333

    瀏覽量

    62723
  • 二叉樹
    +關注

    關注

    0

    文章

    74

    瀏覽量

    12348

原文標題:二叉樹的最小深度!

文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數據結構】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    MCU最小系統電路設計指南

    目錄 一、何為最小系統? 最小系統電路設計 1.電源 (1)各種名詞解釋 (2)為什么會有VDD_1 _2 _3區分? (3)Mirco USB (4)5v->3.3v濾波電路 (5)電源指示燈
    的頭像 發表于 12-09 12:38 ?480次閱讀
    MCU<b class='flag-5'>最小</b>系統電路設計指南

    為什么Gain=1對應的默認值不是16位進制補碼的中間數而是最小數?

    十進制的-32768,7FFFh為十進制的32767;分別對應最大碼和最小碼,為什么Gain=1對應的默認值不是16位進制補碼的中間數而是最小數?
    發表于 11-18 08:12

    GPU深度學習應用案例

    能力,可以顯著提高圖像識別模型的訓練速度和準確性。例如,在人臉識別、自動駕駛等領域,GPU被廣泛應用于加速深度學習模型的訓練和推理過程。 、自然語言處理 自然語言處理(NLP)是深度學習的另一個重要應用領域。GPU可以加速NL
    的頭像 發表于 10-27 11:13 ?414次閱讀

    鐳神智能機器人三向式3D SLAM無人叉車:重塑高位堆垛與窄通道倉儲新境界

    在智能制造與智慧物流的浪潮中,鐳神智能憑借其卓越的技術實力,推出了革命性的三向式3DSLAM無人叉車LXK12-B。這款無人叉車不僅集成了自主搬運、智能堆垛等功能,更以舉升高度5m、貨180
    的頭像 發表于 10-26 08:03 ?148次閱讀
    鐳神智能機器人三向<b class='flag-5'>叉</b>式3D SLAM無人叉車:重塑高位堆垛與窄通道倉儲新境界

    什么是默克爾(Merkle Tree)?如何計算默克爾根?

    01 默克爾的概念 默克爾(Merkle Tree)是一種特殊的二叉樹,它的每個節點都存儲了一個數據塊的哈希值。哈希值是一種可以將任意長度的數據轉換為固定長度的字符串的算法,它具有唯一性和不可
    的頭像 發表于 09-30 18:22 ?974次閱讀
    什么是默克爾<b class='flag-5'>樹</b>(Merkle Tree)?如何計算默克爾根?

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

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

    指MOSFET器件靜電防護魯棒性提升技巧

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

    esp32c3運行examples/wifi/getting_started/softAP例子,設置密碼后WIFI標志上顯示一個,為什么?

    運行examples/wifi/getting_started/softAP例子,發現如果不設置密碼可以正常連上,但設置密碼后WIFI標志上顯示一個,輸入密碼后無法連接
    發表于 06-06 06:42

    示波器怎么設置存儲深度

    存儲深度,也稱為記錄長度,是指示波器能夠連續捕獲和存儲的采樣點數。它決定了示波器能夠捕獲的波形的時間長度,以及能夠分辨的最小時間間隔。
    的頭像 發表于 05-31 15:42 ?1767次閱讀

    原理圖設計里兩顆重要的(國產EDA)

    原理圖里面兩顆重要的,那就是元件和網絡,作為EDA工具中的重要視圖和概念,雖然看似枯燥,但它們扮演著非常重要的角色,它們為電路圖的層次化結構提供了有力支撐。想象一個大型的電路設計項目,就像一個
    的頭像 發表于 05-29 17:47 ?767次閱讀
    原理圖設計里兩顆重要的<b class='flag-5'>樹</b>(國產EDA)

    圣誕燈電路圖分享

    圣誕裝飾的電路分為兩個主要部分,即燈光和聲音部分。照明部分由五組 LED 組成,它們以進制順序運行,每隔幾分鐘就會重復一次。在這里,根據我們的興趣,LED 可以是任何顏色。這件裝飾品可以裝飾您的圣誕以及您的家。
    的頭像 發表于 05-05 10:12 ?1104次閱讀
    圣誕<b class='flag-5'>樹</b>燈電路圖分享

    迅鐳激光中標叉車行業龍頭杭集團!

    中國制造業企業500強、中國民營企業500強——杭集團響應號召,更“新”設備,引入迅鐳高功率激光切割設備,建設智能工廠,向世界展示中國制造的智慧與力量!
    的頭像 發表于 04-19 14:47 ?341次閱讀
    迅鐳激光中標叉車行業龍頭杭<b class='flag-5'>叉</b>集團!

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

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

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

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

    MCP251X can驅動移植nuc980采樣用設備配置時,中斷如何配置設備?

    MCP251X can驅動移植nuc980 采樣用設備配置時,中斷如何配置設備? spi0: spi@b0061000 { status = \"okay\"
    發表于 01-17 06:43
    主站蜘蛛池模板: 四虎永久影院永久影库| 加勒比黑人喝羽月希奶水| 福利在线播放| 播五月婷婷| 欧美日韩无| 天堂网2021天堂手机版丶| 国产在线麻豆自在拍91精品| 国产精品1区2区3区| www射| 人人干人人干| 天天做天天爱天天做天天吃中| 国产精品最新资源网| 欧美三级视频| 色播图片| 性色在线视频精品| 综合色吧| 成人二区| 精品久久久久久国产免费了| 最近高清在线国语| 特级aaa毛片| 免费看黄色网页| 日本免费观看完整视频| 性色欧美| 欧美福利视频网站| 国产高清在线视频| 国产三级影院| 国内一级特黄女人精品片| 美女视频很黄很a免费国产| 日日噜噜夜夜狠狠tv视频免费| 欧美午夜电影| 成年人网站在线| 日日爱网址| 免费三级pq| 免费国产午夜高清在线视频| 2020天天操| 中文字幕在线一区二区在线| 免费大片黄国产在线观看| 六月丁香啪啪六月激情| 老师今晚让你爽个够| 久久国产精品免费观看| 四虎影院免费视频|