662. 二叉树最大宽度
给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(full binary tree)结构相同,但一些节点为空。
每一层的宽度被定义为两个端点(该层最左和最右的非空节点,两端点间的null节点也计入长度)之间的长度。
解:
- 给每个节点一个编号,假如一个节点是第i个节点,那么它的左右子节点的编号分别是2i + 1, 2i + 2
- 宽度优先遍历二叉树,在某一层的时候,记录数组长度len,遍历len次,直接把这一整层节点取出来放入临时数组tempNodes
- 最大宽度就是tempNodes的队首和队尾的节点编号之差 + 1
- 测试用例的树的深度过深会精度丢失,所以使用
BigInt类型来处理
const widthOfBinaryTree = function(root) {
let res = BigInt(Number.MIN_SAFE_INTEGER);
const queue = [{
node: root,
idx: 0n
}]
while (queue.length) {
const len = queue.length
const tempNodes = []
for (let i = 0; i < len; i++) {
const nodeInfo = queue.shift()
const { node, idx } = nodeInfo
tempNodes.push(nodeInfo)
node.left && queue.push({
node:node.left,
idx:idx * 2n + 1n
})
node.right && queue.push({
node: node.right,
idx: idx * 2n + 2n
})
}
const tempRes = tempNodes[tempNodes.length - 1].idx - tempNodes[0].idx + 1n
if (tempRes > res) res = tempRes
}
return res
};