662. 二叉树最大宽度
给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(full binary tree)结构相同,但一些节点为空。
每一层的宽度被定义为两个端点(该层最左和最右的非空节点,两端点间的null节点也计入长度)之间的长度。
输入:
1[0]
/ \
3[0] 2[1] queue = [[3,0], [2,1]]
/ \ \
5[0] 3[1] 9[3]
输出: 4 解释: 最大值出现在树的第 3 层,宽度为 4 (5,3,null,9)。
解法
- 我们这里需要对每个节点进行编号如上面中括号所示。
- 编号完毕算出每次最后一个节点-第一个节点的编号+1 就是最大宽度了
- 然后取每层最大的宽度
如何编号呢?
需要一个队列
queue将以[节点, 编号]的形式存储到队列里 首先我们需要将根节点放进来[root, 0]然后初始化l,r分别为左右两边节点的编号,然后遍历queue中的节点对右边的节点值编号更新r的值。遍历的同时还要将节点的左子节点和右子节点的以[节点, 编号]的形式加入队列里。(这里子节点的编号在测试用例给出了数值超过js的存储大小,所以呢,我们要计算一个相对编号,即当前编号减去左边节点的编号) 遍历结束后即当前层级的二叉树就得到了宽度为r-l+1最后得出最大宽度。
完整代码
var widthOfBinaryTree = function(root){
var queue = [], ans= 0
queue.push([root,0])
while(queue.length> 0){
let len = queue.length
let l = r = queue[0][1]
for(let i =0;i<len;i++){
const [node, ind] = queue.shift()
r = ind // 每遍历一下刷新右侧节点编号
if(node.left)queue.push([node.left, (ind-l) *2])
if(node.right)queue.push([node.right, (ind-l) *2 + 1])
}
ans = Math.max(ans, r-l+1)
}
return ans;
}