* struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     * @return int整型
     */
    //整个方法相当于层序遍历,其中主要是将每一个结点的下标也存入节点中
    //然后一层一层的进行遍历,front方法出对头,back()方法出队尾
    //然后每一层出来的时候都记下队头和队尾的坐标差,其中最大的坐标差即是结果
    int widthOfBinaryTree(TreeNode* root) {
        // write code here
        if(!root) return 0;
        queue<TreeNode*> q;
        q.push(root);
        int  maxVal = INT_MIN;
        
        while(!q.empty()){
            int levelW = q.size();  //每一层的元素个数
            
            maxVal = max(maxVal, q.back()->val - q.front()->val + 1);
            int offset = q.front()->val;  //一开始的偏移增量
            while(levelW--){
                TreeNode* cur = q.front();
                TreeNode* end = q.back();
                q.pop();
                
                //maxVal = max(maxVal, end->val - cur->val + 1);
                int val = cur->val - offset;  //当前节点相对于队头元素的偏移量
                
                if(cur->left){
                    cur->left->val = 2 * val + 1;  //将数组的下标也存进去
                    q.push(cur->left);
                }
                if(cur->right){
                    cur->right->val = 2 * val + 2;
                    q.push(cur->right);
                }
            }
        }
        return maxVal;
    }
};