一日一练:二叉树最大宽度

104 阅读1分钟

给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(full binary tree)结构相同,但一些节点为空。

思路

深度优先 + 递归

image.png

如上图所示,按照满二叉树给每个节点标注位置:

设置根节点为1,左节点为parent * 2,右节点有parent * 2 + 1

那么可以通过每层的最右位置 - 最左位置得到该层的宽度。左右位置确定:

  • 最左位置:通过前序遍历的方式,每个level的第一个pos就是最左的位置
  • 最右位置:同层,就用 当前pos - 最左位置,每次取较大值的就可以

代码

function widthOfBinaryTree(root: TreeNode | null): number {
  let largestWidth = 0
  const map = new Map<number, number>()
  function dfs(node: TreeNode | null, level: number, pos: number) {
    if (node === null) return
    if (map.has(level)) {
      largestWidth = Math.max(largestWidth, pos - map.get(level) + 1)
    } else {
      largestWidth = Math.max(largestWidth, 1)
      map.set(level, pos)
    }
    node.left && dfs(node.left, level + 1, pos * 2)
    node.right && dfs(node.right, level + 1, pos * 2 + 1)
  }

  dfs(root, 1, 1)
  return largestWidth
}