给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(full binary tree)结构相同,但一些节点为空。
思路
深度优先 + 递归
如上图所示,按照满二叉树给每个节点标注位置:
设置根节点为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
}