题目
题目来源:力扣(LeetCode)
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。
示例 :
给定二叉树
1<br /> / \<br /> 2 3<br /> / \ <br /> 4 5 <br />返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。
思路分析
一条路径的长度为该路径经过的节点数减一,所以求直径(即求路径长度的最大值)等效于求路径经过节点数的最大值减一。
对于某节点的左儿子向下遍历经过最多的节点数 L (即以左儿子为根的子树的深度) 和其右儿子向下遍历经过最多的节点数 R (即以右儿子为根的子树的深度) ,那么以该节点为起点的路径经过节点数的最大值即为 L+R+1 。
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @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);
// 获取树的最长路径
// L + R + 1 = 左子树深度(节点个数) + 右子树深度(节点个数) + 1个根节点;
ans = Math.max(ans, L + R + 1);
// 已经知道因为根节点的左右子树的深度,则左右子树深度的最大值+1,即是以根节点为主的最大深度
return Math.max(L, R) + 1;
}
depth(root);
// 由于depth函数中已经默认加上自身跟节点路径,所以最后减去1
return ans - 1;
};