40.二叉树的直径

47 阅读1分钟

题目链接

给你一棵二叉树的根节点,返回该树的 直径 。

二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 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)