给你一棵二叉树的根节点,返回该树的 直径 。
二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。
两节点之间路径的 长度 由它们之间边数表示。
解法 递归dfs
思路
最长直径看起来就是左子树的最大深度加上右子树的最大深度,但是其实这样有一个误区,如果该root没有左子树或者右子树,那么相加时不是它的最大直径。
不能简单的直接返回 maxDepth(root.left) + maxDepth(root.right) 。所以需要在递归时加上一个变量来更新这个直径。
代码
function diameterOfBinaryTree(root: TreeNode | null): number {
let diameter = 0;
const maxDepth = (node) => {
if (!node) return 0;
const left = maxDepth(node.left);
const right = maxDepth(node.right);
diameter = Math.max(diameter, left + right);
return Math.max(left, right) + 1;
}
maxDepth(root);
return diameter;
};
时空复杂度
时间复杂度:O(n)
空间复杂度:O(h)