1. 程式人生 > 其它 >2021-01-03 | 543. 二叉樹的直徑

2021-01-03 | 543. 二叉樹的直徑

技術標籤: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 };

4. 提交結果

在這裡插入圖片描述