* 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;
}
};