2021-01-03 | 543. 二叉樹的直徑
阿新 • • 發佈:2021-01-10
技術標籤:2021 LeetCode每日一題二叉樹資料結構演算法leetcodeJavaScript
1. 題目描述
給定一棵二叉樹,你需要計算它的直徑長度。一棵二叉樹的直徑長度是任意兩個結點路徑長度中的最大值。這條路徑可能穿過也可能不穿過根結點。
示例 :
給定二叉樹
1
/ \
2 3
/ \
4 5
返回 3, 它的長度是路徑 [4,2,1,3] 或者 [5,2,1,3]。
2. 解題思路
遇到二叉樹的問題,我們在遍歷時通常是採用深度優先遍歷和廣度優先遍歷,這裡需要求直徑,我們就使用到了深度優先遍歷。
從根節點進行遍歷,在遍歷到每個節點的時候,將其左右子樹的最大深度加在一起,與結果res對比,並將最大的值賦值給熱搜,這樣使res一直保持是最大的值。
最後返回res即可。
複雜度分析:
- 時間複雜度:O(n),其中n為二叉樹的節點數,這裡需要遍歷整棵二叉樹,所以時間複雜度為O(n)。
- 空間複雜度:O(h),其中h是二叉樹的最大深度,是一個常數變數。
3. 程式碼實現
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {number}
*/
var diameterOfBinaryTree = function(root) {
let res = 0
function depth(rootNode){
if(!rootNode) return 0
let l = depth(rootNode.left) // l為左子樹的深度
let r = depth(rootNode.right) // r為右子樹的深度
res = Math.max(res, l + r) // 計算最大直徑l+r,更新res,能保持其一直是最大值
return Math.max(l ,r) + 1 // 返回以該節點為根的子樹的深度
}
depth(root)
return res
};