算法学习记录(一百)

32 阅读1分钟

662. 二叉树最大宽度

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

每一层的宽度被定义为两个端点(该层最左和最右的非空节点,两端点间的null节点也计入长度)之间的长度。

image.png

解:

  1. 给每个节点一个编号,假如一个节点是第i个节点,那么它的左右子节点的编号分别是2i + 1, 2i + 2
  2. 宽度优先遍历二叉树,在某一层的时候,记录数组长度len,遍历len次,直接把这一整层节点取出来放入临时数组tempNodes
  3. 最大宽度就是tempNodes的队首和队尾的节点编号之差 + 1
  4. 测试用例的树的深度过深会精度丢失,所以使用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
};