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

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

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

3天內不再提示

二叉樹的最大深度

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

盡管之前你可能做過這道題目,但只要認真看完,相信你會收獲滿滿!可以一起解決如下兩道題目:

  • 104.二叉樹的最大深度
  • 559.n叉樹的最大深度

104.二叉樹的最大深度

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

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

二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數。

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

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

7b9b835a-0c92-11ed-ba43-dac502259ad0.png

返回它的最大深度 3 。

遞歸法

本題可以使用前序(中左右),也可以使用后序遍歷(左右中),使用前序求的就是深度,使用后序求的是高度。

而根節點的高度就是二叉樹的最大深度,所以本題中我們通過后序求的根節點高度來求的二叉樹最大深度。

這一點其實是很多同學沒有想清楚的,很多題解同樣沒有講清楚。

我先用后序遍歷(左右中)來計算樹的高度。

  1. 確定遞歸函數的參數和返回值:參數就是傳入樹的根節點,返回就返回這棵樹的深度,所以返回值為int類型。

代碼如下:

intgetdepth(treenode*node)
  1. 確定終止條件:如果為空節點的話,就返回0,表示高度為0。

代碼如下:

if(node==null)return0;
  1. 確定單層遞歸的邏輯:先求它的左子樹的深度,再求的右子樹的深度,最后取左右深度最大的數值 再+1 (加1是因為算上當前中間節點)就是目前節點為根節點的樹的深度。

代碼如下:

intleftdepth=getdepth(node->left);//左
intrightdepth=getdepth(node->right);//右
intdepth=1+max(leftdepth,rightdepth);//中
returndepth;

所以整體c++代碼如下:

classsolution{
public:
intgetdepth(treenode*node){
if(node==null)return0;
intleftdepth=getdepth(node->left);//左
intrightdepth=getdepth(node->right);//右
intdepth=1+max(leftdepth,rightdepth);//中
returndepth;
}
intmaxdepth(treenode*root){
returngetdepth(root);
}
};

代碼精簡之后c++代碼如下:

classsolution{
public:
intmaxdepth(treenode*root){
if(root==null)return0;
return1+max(maxdepth(root->left),maxdepth(root->right));
}
};

精簡之后的代碼根本看不出是哪種遍歷方式,也看不出遞歸三部曲的步驟,所以如果對二叉樹的操作還不熟練,盡量不要直接照著精簡代碼來學。

本題當然也可以使用前序,代碼如下:(充分表現出求深度回溯的過程)

classsolution{
public:
intresult;
voidgetdepth(treenode*node,intdepth){
result=depth>result?depth:result;//中

if(node->left==null&&node->right==null)return;

if(node->left){//左
depth++;//深度+1
getdepth(node->left,depth);
depth--;//回溯,深度-1
}
if(node->right){//右
depth++;//深度+1
getdepth(node->right,depth);
depth--;//回溯,深度-1
}
return;
}
intmaxdepth(treenode*root){
result=0;
if(root==0)returnresult;
getdepth(root,1);
returnresult;
}
};

可以看出使用了前序(中左右)的遍歷順序,這才是真正求深度的邏輯!

注意以上代碼是為了把細節體現出來,簡化一下代碼如下:

classsolution{
public:
intresult;
voidgetdepth(treenode*node,intdepth){
result=depth>result?depth:result;//中
if(node->left==null&&node->right==null)return;
if(node->left){//左
getdepth(node->left,depth+1);
}
if(node->right){//右
getdepth(node->right,depth+1);
}
return;
}
intmaxdepth(treenode*root){
result=0;
if(root==0)returnresult;
getdepth(root,1);
returnresult;
}
};

迭代法

使用迭代法的話,使用層序遍歷是最為合適的,因為最大的深度就是二叉樹的層數,和層序遍歷的方式極其吻合。

在二叉樹中,一層一層的來遍歷二叉樹,記錄一下遍歷的層數就是二叉樹的深度,如圖所示:

7bb59e02-0c92-11ed-ba43-dac502259ad0.png

所以這道題的迭代法就是一道模板題,可以使用二叉樹層序遍歷的模板來解決的。

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

c++代碼如下:

classsolution{
public:
intmaxdepth(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);
}
}
returndepth;
}
};

那么我們可以順便解決一下n叉樹的最大深度問題

559.n叉樹的最大深度

題目地址:https://leetcode-cn.com/problems/maximum-depth-of-n-ary-tree/

給定一個 n 叉樹,找到其最大深度。

最大深度是指從根節點到最遠葉子節點的最長路徑上的節點總數。

例如,給定一個 3叉樹 :

7bc4f44c-0c92-11ed-ba43-dac502259ad0.png

我們應返回其最大深度,3。

思路:

依然可以提供遞歸法和迭代法,來解決這個問題,思路是和二叉樹思路一樣的,直接給出代碼如下:

遞歸法

c++代碼:

classsolution{
public:
intmaxdepth(node*root){
if(root==0)return0;
intdepth=0;
for(inti=0;ichildren.size();i++){
depth=max(depth,maxdepth(root->children[i]));
}
returndepth+1;
}
};

迭代法

依然是層序遍歷,代碼如下:

classsolution{
public:
intmaxdepth(node*root){
queueque;
if(root!=null)que.push(root);
intdepth=0;
while(!que.empty()){
intsize=que.size();
depth++;//記錄深度
for(inti=0;ifor(intj=0;jchildren.size();j++){
if(node->children[j])que.push(node->children[j]);
}
}
}
returndepth;
}
};

其他語言版本

java

104.二叉樹的最大深度

classsolution{
/**
*遞歸法
*/
publicintmaxdepth(treenoderoot){
if(root==null){
return0;
}
intleftdepth=maxdepth(root.left);
intrightdepth=maxdepth(root.right);
returnmath.max(leftdepth,rightdepth)+1;

}
}
classsolution{
/**
*迭代法,使用層序遍歷
*/
publicintmaxdepth(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){
deque.offer(poll.left);
}
if(poll.right!=null){
deque.offer(poll.right);
}
}
}
returndepth;
}
}

python

104.二叉樹的最大深度

遞歸法:

classsolution:
defmaxdepth(self,root:treenode)->int:
returnself.getdepth(root)

defgetdepth(self,node):
ifnotnode:
return0
leftdepth=self.getdepth(node.left)#左
rightdepth=self.getdepth(node.right)#右
depth=1+max(leftdepth,rightdepth)#中
returndepth

遞歸法:精簡代碼

classsolution:
defmaxdepth(self,root:treenode)->int:
ifnotroot:
return0
return1+max(self.maxdepth(root.left),self.maxdepth(root.right))

迭代法:

importcollections
classsolution:
defmaxdepth(self,root:treenode)->int:
ifnotroot:
return0
depth=0#記錄深度
queue=collections.deque()
queue.append(root)
whilequeue:
size=len(queue)
depth+=1
foriinrange(size):
node=queue.popleft()
ifnode.left:
queue.append(node.left)
ifnode.right:
queue.append(node.right)
returndepth

559.n叉樹的最大深度

遞歸法:

classsolution:
defmaxdepth(self,root:'node')->int:
ifnotroot:
return0
depth=0
foriinrange(len(root.children)):
depth=max(depth,self.maxdepth(root.children[i]))
returndepth+1

迭代法:

importcollections
classsolution:
defmaxdepth(self,root:'node')->int:
queue=collections.deque()
ifroot:
queue.append(root)
depth=0#記錄深度
whilequeue:
size=len(queue)
depth+=1
foriinrange(size):
node=queue.popleft()
forjinrange(len(node.children)):
ifnode.children[j]:
queue.append(node.children[j])
returndepth

使用棧來模擬后序遍歷依然可以

classsolution:
defmaxdepth(self,root:'node')->int:
st=[]
ifroot:
st.append(root)
depth=0
result=0
whilest:
node=st.pop()
ifnode!=none:
st.append(node)#中
st.append(none)
depth+=1
foriinrange(len(node.children)):#處理孩子
ifnode.children[i]:
st.append(node.children[i])

else:
node=st.pop()
depth-=1
result=max(result,depth)
returnresult

審核編輯 :李倩


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

    關注

    21

    文章

    2085

    瀏覽量

    73301
  • 代碼
    +關注

    關注

    30

    文章

    4670

    瀏覽量

    67764
  • 二叉樹
    +關注

    關注

    0

    文章

    74

    瀏覽量

    12283

原文標題:看看這些樹的最大深度!

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

收藏 人收藏

    評論

    相關推薦

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

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

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

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

    CUBEIDE配置H750的時候時鐘報警,最大480M只能上400M,為什么?

    CUBEIDE配置H750的時候時鐘報警,最大480M只能上400M
    發表于 03-21 07:19

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

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

    如何修改內核設備

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

    堆的實現思路

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

    二叉樹的定義

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

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

    時,默認情況下, 加密后的數據會被保存在/data/tee目錄中。 安全存儲功能使用 二叉樹的方式來 保存加密后的文件。 當第一次使用安全存儲功能創建用于保存敏感數據的安全文件時,OP-TEE將會在/data/tee目錄中生成兩個文件:dirf.db文件和以數字命名的文件。 dirf.db文
    的頭像 發表于 11-21 11:49 ?545次閱讀
    OP-TEE安全存儲安全文件的格式

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

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

    紅黑的特點及應用

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

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

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

    極管的最大整流電流是什么 極管最大整流電流怎么計算

    極管的最大整流電流是什么 極管最大整流電流怎么計算? 極管是電子學中最常見的元件之一,主要用于電路中的整流、穩壓、切換等作用。其中,整
    的頭像 發表于 10-18 16:48 ?3488次閱讀

    文件系統-多二叉樹的轉化

    在這一節中,我們來學習如何使用程序來實現一棵文件。在上一節中,我們了解到使用文件的方式來整合計算機中所有的資源,而這一棵文件則是一棵多
    的頭像 發表于 10-11 10:06 ?768次閱讀
    文件系統-多<b class='flag-5'>叉</b><b class='flag-5'>樹</b>與<b class='flag-5'>二叉樹</b>的轉化

    數據結構面試之二叉樹相關操作

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

    物聯網開發需要學習哪些內容?

    和需要掌握的技能。 1. 物聯網軟件開發必備編程技術: Linux C語言、數據結構 核心技能內容: 必備的Linux命令; C語言的基礎知識; C語言的數組、指針和函數; 數據結構中的線性表、棧和隊列用法及實現; 二叉樹遞歸遍歷、層次遍歷、及非
    的頭像 發表于 10-09 17:23 ?1388次閱讀