一、題目描述
給定一棵二叉樹,你需要計算它的直徑長度。一棵二叉樹的直徑長度是任意兩個結點路徑長度中的最大值。這條路徑可能穿過根結點。
二、示例
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;
};