二叉樹的直徑

2021-10-04 07:04:51 字數 2589 閱讀 4377

題目:給定一棵二叉樹,你需要計算它的直徑長度。一棵二叉樹的直徑長度是任意兩個結點路徑長度中的最大值。這條路徑可能穿過根結點。

示例 :

給定二叉樹

返回 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]

返回它的最小深度 2.

思想:最開始我就想著把上面的**max改為min就可以了,但是測試一下全死。原因是這裡說了葉子節點是指沒有子節點的節點,就是所最小深度的產生只能從根節點到葉子節點,而不能是:

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 考慮的重點在於,後序中的操作是什麼,左右子樹返回什麼。顯然,對於當前訪問的結點,我們的目標是以它為根的直...