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