題目:給定一個二叉樹,找出其最大深度。二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數。
說明:葉子節點是指沒有子節點的節點。
連結: 力扣Leetcode—初級演算法—樹—二叉樹的最大深度.
示例 :
給定二叉樹 [3,9,20,null,null,15,7]
3
/ \
9 20
/ \
15 7
返回它的最大深度 3 。
標籤:樹、深度優先搜尋、廣度優先搜尋、二叉樹
思路:找出樹中深度最大的子樹,把他看成一個新樹,再繼續從新樹中找出深度較大者。一直遞迴到臨界點,即當樹根為空時,說明樹不存在,深度為 0,遞迴結束,在其中每遞迴一次,深度就+1。
主要Go程式碼如下:
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func maxDepth(root *TreeNode) int {
i := 0
j := 0
if root == nil {
return 0
}
i = maxDepth(root.Left) + 1
j = maxDepth(root.Right) + 1
if i < j {
i, j = j, i
}
return i
}
提交截圖:
官方解答:官方用了遞迴 DFS(深度優先搜尋 Depth-First-Search),樹的最大深度 = 根節點的高度(根本身為 1 )+ 左右子樹的最大深度中的較大者。而左右子樹最大深度怎麼求呢?以左子樹為例,把它看成新的一棵樹,那麼它的最大深度就是:根節點的高度(根本身為 1 )+ 左右子樹的最大深度中的較大者。這樣就發現遞迴的所在點了。到臨界點即當樹根為空時,說明樹不存在,深度為 0,遞迴結束。
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func maxDepth(root *TreeNode) int {
if root == nil{
return 0
}
return max(maxDepth(root.Left), maxDepth(root.Right)) + 1
}
func max(a,b int)int {
if a > b {
return a
}
return b
}