LeetCode 二叉樹的直徑(javascript解法)

一、題目描述

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

二、示例

      1
     / \
    2   3
   / \     
  4   5    

返回 3, 它的長度是路徑 [4,2,1,3] 或者 [5,2,1,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) {
    // 默認爲1是因爲默認了根節點自身的路徑長度
    let ans = 1;

    function depth(rootNode) {
        if (!rootNode) {
            // 如果不存在根節點,則深度爲0
            return 0;
        }
        // 遞歸,獲取左子樹的深度
        let L = depth(rootNode.left);
        // 遞歸,獲取右子樹的深度
        let R = depth(rootNode.right);

        /* 關鍵點1
        L+R+1的公式是如何而來?
        等同於:左子樹深度(節點個數) + 右子樹深度(節點個數) + 1個根節點
        便是這株二叉樹從最左側葉子節點到最右側葉子節點的最長路徑
        類似於平衡二叉樹的最小值節點到最大值節點的最長路徑
        之所以+1是因爲需要經過根節點
         */
        // 獲取該樹的最長路徑和現有最長路徑中最大的那個
        ans = Math.max(ans, L + R + 1);
        /* 關鍵點2
        已知根節點的左右子樹的深度,
        則,左右子樹深度的最大值 + 1,
        便是以根節點爲數的最大深度*/
        return Math.max(L, R) + 1;
    }

    depth(root);

    // 由於depth函數中已經默認加上數節點的自身根節點路徑了,故此處需減1
    return ans - 1;
}; 

四、結果

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章