題目:給定一棵二叉樹,你需要計算它的直徑長度。一棵二叉樹的直徑長度是任意兩個結點路徑長度中的最大值。這條路徑可能穿過根結點。
示例 :
給定二叉樹思想:我們不難發現這個問題的本質就是求每個節點的左孩子深度+右孩子深度,最大的就是直徑,我們下圖來說明返回 3, 它的長度是路徑 [4,2,1,3] 或者 [5,2,1,3]。
注意:兩結點之間的路徑長度是以它們之間邊的數目表示。
注意:我們用遞迴求解每乙個節點的深度,求每乙個每乙個節點的深度時為:max(l+r)+1,這個1為自身。左孩子深度為l和右孩子深度r:z=l+r,所以要定義乙個全域性的z來儲存最大的,
**:
int z;
//全域性的
intdep
(treenode* root)
int l=
dep(root-
>left)
;//左邊深度
int r=
dep(root-
>right)
;//右邊深度
z=max(z,l+r)
;//最大
return
max(l,r)+1
;//遞迴求解每乙個的深度
}int
diameterofbinarytree
(treenode* root)
}
注意:z不能作為每次遞迴的返回值,因為我們的本質還是求深度,否則無法實現。如果還不理解的話可以看一下下面的二叉樹深度的講解。
題目:輸入一棵二叉樹的根節點,求該樹的深度。從根節點到葉節點依次經過的節點(含根、葉節點)形成樹的一條路徑,最長路徑的長度為樹的深度。
例如:
給定二叉樹 [3,9,20,null,null,15,7]思想:我們不斷地遞迴求解左孩子,右孩子的深度,看下圖詳解版:返回它的最大深度 3 。
我們可以看到先不斷的遞迴左子樹,再遞迴右子樹,得到最大值,然後加上1即為二叉樹的深度。那麼**如下:
**:
int
maxdepth
(treenode* root)
return
max(
maxdepth
(root-
>left)
,maxdepth
(root-
>right))+
1;//如果用問冒運算子求最大會超出時間限制。
}
題目:給定乙個二叉樹,找出其最小深度。最小深度是從根節點到最近葉子節點的最短路徑上的節點數量。
說明: 葉子節點是指沒有子節點的節點。
示例:
給定二叉樹 [3,9,20,null,null,15,7]思想:最開始我就想著把上面的**max改為min就可以了,但是測試一下全死。原因是這裡說了葉子節點是指沒有子節點的節點,就是所最小深度的產生只能從根節點到葉子節點,而不能是:返回它的最小深度 2.
int
mindepth
(treenode* root)
if(root-
>left==
null
&&root-
>right==
null
)//葉節點
int l=
mindepth
(root-
>left)
;int r=
mindepth
(root-
>right);if
(root-
>left==
null
||root-
>right==
null
)//有乙個子節點
return
min(l,r)+1
;//有兩個
}
加油哦!?。 二叉樹的直徑
題目 給定一棵二叉樹,你需要計算它的直徑長度。一棵二叉樹的直徑長度是任意兩個結點路徑長度中的最大值。這條路徑可能穿過也可能不穿過根結點。definition for a binary tree node.public class treenode class solution diameterofb...
二叉樹的直徑
給定一棵二叉樹,你需要計算它的直徑長度。一棵二叉樹的直徑長度是任意兩個結點路徑長度中的最大值。這條路徑可能穿過也可能不穿過根結點。示例 給定二叉樹 返回 3,它的長度是路徑 4,2,1,3 或者 5,2,1,3 概念理解 這條路徑可能穿過也可能不穿過根結點 任意一條路徑可由某結點為起點,再向下遍歷其...
二叉樹直徑問題
二叉樹的直徑 根據題目意思,所謂二叉樹的直徑,就是以某一結點為根,左右子樹深度之和減1。二叉樹的題目,不用多說,肯定是遞迴遍歷框架。後序 void lastorder treenode root 考慮的重點在於,後序中的操作是什麼,左右子樹返回什麼。顯然,對於當前訪問的結點,我們的目標是以它為根的直...