思路:本题乍一看可以用层序遍历?但是涉及到空节点的问题,层序遍历存在诸多麻烦,因此可以利用二叉树的特性:左叶子节点的序号为根节点的两倍,右叶子节点的序号为根节点的2倍加1.利用这个性质,我们把每一层的最左节点的序号加入一个map中(这个动作只进行一次即可),以后每次遍历到该层的时候,刷新该层的最大节点数即可。

public class Solution {
    int res = 0;
    Map<Integer, Integer> levelRecord = new HashMap<>();
    public int widthOfBinaryTree (TreeNode root) {
        if(root==null)return 0;
        dfs(root,0,0);
        return res;
    }
    public void dfs(TreeNode root,int depth,int index){
        if(root==null)return;
        if(levelRecord.get(depth)==null)levelRecord.put(depth,index);
        res = Math.max(res,index - levelRecord.get(depth)+1);
        dfs(root.left,depth+1,index*2);
        dfs(root.right,depth+1,index*2+1);
    }
}