思路:将每个结点的值修改为 按照满二叉树结点的序号(从0开始)
使用队列迭代每一层(即二叉树的层序遍历),队尾元素的值 - 队头元素的值 + 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 {
public int widthOfBinaryTree(TreeNode root) {
if(root == null) {
return 0;
}
Deque<TreeNode> queue = new LinkedList<>();
// 根节点编号为 0
root.val = 0;
queue.offer(root);
int levelSize;
int ans = 0;
while(!queue.isEmpty()) {
levelSize = queue.size();
// 队头和队尾的编号值求差用来更新宽度
ans = Math.max(ans, queue.getLast().val - queue.getFirst().val + 1);
// 一次处理一层,进入这个循环前队列中是一层的所有非空节点
while(levelSize != 0) {
TreeNode temp = queue.poll();
// 子节点入队前修改 val, val = 满二叉树中节点编号
if(temp.left != null) {
temp.left.val = temp.val * 2 + 1;
queue.offer(temp.left);
}
if(temp.right != null) {
temp.right.val = temp.val * 2 + 2;
queue.offer(temp.right);
}
levelSize--;
}
}
return ans;
}
}
优化后的代码
class Solution {
public int widthOfBinaryTree(TreeNode root) {
if (root == null) return 0;
Deque<TreeNode> queue = new LinkedList<>();
root.val = 0; //根节点存储的数据赋值为0
queue.offer(root);
int levelSize = 0;
int ans = 0;
while ( !queue.isEmpty()){
levelSize = queue.size();
ans = Math.max(ans, queue.getLast().val - queue.getFirst().val + 1);
while ( levelSize-- != 0){
TreeNode node = queue.poll();
if (node.left != null){ //左右子树存在,则修改结点值入队,为下一层循环做准备
node.left.val = node.val*2 + 1;
queue.offer(node.left);
}
if (node.right != null){
node.right.val = node.val*2 + 2;
queue.offer(node.right);
}
}
}
return ans;
}
}