给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(full binary tree)结构相同,但一些节点为空。
每一层的宽度被定义为两个端点(该层最左和最右的非空节点,两端点间的null节点也计入长度)之间的长度。
解题思路
示例1
1
/ \
3 2
/ \ \
5 3 9
1
/ \
2 3
/ \ \
4 5 7
示例1二叉树的最大宽度是4,也就是最后一层的节点(5, 3, null, 9)所组成的最大宽度,我们可以将每一层的每个节点都做顺序编号,这样我们就可以很容易的值的当前层的宽度
比如:
第2层的宽度为 编号3 - 编号2 + 1 = 2
第3层的宽度为 编号7 - 编号4 + 1 = 4
所以我们可以对二叉树给每个节点设置一个编号,然后对二叉树进行层序遍历(层序遍历使用迭代方式),将每层编号的最大值和最小值相减加1得到这一层的最大宽度
代码
var widthOfBinaryTree = function(root) {
if (!root) return 0
// 1n表示大整数
let maxWidth = 1, queue = [[1n, root]]
while(queue.length) {
// 取当前层编号最大值和最小值计算宽度
let width = queue[queue.length - 1][0] - queue[0][0] + 1n
if (width > maxWidth) maxWidth = width
let temp = []
// 遍历二叉树下一层
for (const [i, r] of queue) {
r.left && temp.push([i * 2n, r.left])
r.right && temp.push([i * 2n + 1n, r.right])
}
queue = temp
}
return Number(maxWidth)
};