662. 二叉树最大宽度
题目描述
给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(full binary tree)结构相同,但一些节点为空。
每一层的宽度被定义为两个端点(该层最左和最右的非空节点,两端点间的null节点也计入长度)之间的长度。
示例 1:
示例 2:
示例 3:
示例 4:
思路
二叉树层次遍历,根节点位置记为pos,左节点
2
∗
p
o
s
2*pos
2∗pos,右节点
2
∗
p
o
s
+
1
2*pos+1
2∗pos+1。
每一层最左边节点的pos记为left,最右边节点的pos记为right,求每一层right - left + 1的最大值
代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int widthOfBinaryTree(TreeNode* root) {
if(root == NULL){
return 0;
}
queue<pair<TreeNode*, unsigned long long>> q;
q.push(make_pair(root, 1));
unsigned long long res = 0;
while(!q.empty()){
int n = q.size();
unsigned long long left = 0, right = 0;
for(int i = 0; i < n; ++i){
TreeNode* node = q.front().first;
unsigned long long pos = q.front().second;
q.pop();
if(i == 0){
left = pos;
}
if(i == n - 1){
right = pos;
}
if(node->left){
q.push(make_pair(node->left, pos * 2));
}
if(node->right){
q.push(make_pair(node->right, pos * 2 + 1));
}
}
res = max(res, right - left + 1);
}
return (int)res;
}
};