LeetCode热题(JS版) - 662. 二叉树最大宽度

162 阅读1分钟

题目描述

给定一棵二叉树,求其中的最大宽度。二叉树的宽度定义为树中任意两个节点之间的距离(也就是层序遍历中相邻节点之间的距离)。

示例

输入:

         1
       /   \
      3     2
     / \     \  
    5   3     9 

输出:4

思路

使用DFS(深度优先搜索)遍历所有节点,并记录每个节点所在的层数和位置。假设当前遍历到第level层第position个节点,若它有左孩子,则左孩子的位置应该为position * 2,若它有右孩子,则右孩子的位置应该为position * 2 + 1。则该节点所在的宽度为position - 第level层最左侧节点的位置 + 1。因此只需要记录每一层最左侧节点的位置即可得到每一层的宽度并取最大值。

代码实现

function widthOfBinaryTree(root: TreeNode | null): number {
  let positions: number[] = [0];
  let width: number = 0;

  function dfs(node: TreeNode | null, level: number, position: number) {
    if (!node) return;
    // 记录该层最左侧的位置
    if (positions[level] === undefined) positions.push(position);
    
    // 当前节点的最大宽度
    let diff = position - positions[level];
    width = Math.max(width, diff + 1);

    dfs(node.left, level + 1, diff * 2);
    dfs(node.right, level + 1, diff * 2 + 1);
  }

  dfs(root, 0, 0)

  return width;
}

时间/空间复杂度

  • 时间复杂度:O(n)O(n),其中n表示二叉树中的节点个数。

  • 空间复杂度:O(h)O(h),其中h表示二叉树的高度。在最坏情况下,二叉树为链式结构,此时递归深度为h,空间复杂度为O(h)O(h)。而在最好情况下,二叉树为满二叉树,其高度为logn\log n,则空间复杂度为O(logn)O(\log n)