题目描述
题解
还记得二叉树层序遍历https://blog.csdn.net/fisherish/article/details/115791079,还有二叉堆的概念,结点如果为 i,那么左子节点值为 i *2,右子节点值为 i * 2 + 1。结合一下本题就能做出来了。
在【Leetcode】440. 字典序的第K小数字中,我们确定一层的节点数量,可以用最右节点值减去最左节点值(排好序的情况下)。因此我们可以自己造数据,每一层的节点都从0开始数,赋值为0,每一层的第二个节点赋值为1,以此类推。让最右结点值减去最左结点值 + 1,就是这一层的节点数量。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
int res = 0;
public int widthOfBinaryTree(TreeNode root) {
Deque<TreeNode> q = new ArrayDeque<>();
root.val = 0;
q.offer(root);
while (!q.isEmpty()) {
int size = q.size();
res = Math.max(res, q.getLast().val - q.getFirst().val + 1);
while (size > 0) {
TreeNode node = q.poll();
System.out.println(node.val);
size--;
if (node.left != null) {
node.left.val = node.val * 2;
q.offer(node.left);
}
if (node.right != null) {
node.right.val = node.val * 2 + 1;
q.offer(node.right);
}
}
}
return res;
}
}