因为是求宽度,所以使用二叉树的层序遍历,由于要计算空节点,所以在遍历的过程中额外维护一个位置队列,在这一层的遍历开始时peek出最左的节点,然后每一个节点都算一次此时的最大宽度,最终遍历完之后得到这一层最大的宽度。
在添加节点的时候要注意要顺便添加当前节点的2倍给左节点,添加当前节点的2倍加1给右节点。
import java.util.ArrayList;
import java.util.LinkedList;
class Solution {
public int widthOfBinaryTree(TreeNode root) {
int res=0;
if(root==null)return res;
Queue<TreeNode> q=new LinkedList<TreeNode>();
Queue<Integer> indexq=new LinkedList<Integer>();
q.offer(root);
indexq.offer(1);
while(!q.isEmpty()){
int size=q.size();
int left=indexq.peek();
for(int i=0;i<size;i++){
TreeNode node=q.poll();
int right=indexq.poll();
res=Math.max(res,right-left+1);
if(node.left!=null) {
q.offer(node.left);
indexq.offer(right*2);
}
if(node.right!=null){
q.offer(node.right);
indexq.offer(right*2+1);
}
}
}
return res;
}
}