Given a binary tree, write a function to get the maximum width of the given tree. The width of a tree is the maximum width among all levels. The binary tree has the same structure as a full binary tree, but some nodes are null.
The width of one level is defined as the length between the end-nodes (the leftmost and right most non-null nodes in the level, where the null nodes between the end-nodes are also counted into the length calculation.
Example 1:
Input:
1
/ \
3 2
/ \ \
5 3 9
Output: 4
Explanation: The maximum width existing in the third level with the length 4 (5,3,null,9).
Example 2:
Input:
1
/
3
/ \
5 3
Output: 2
Explanation: The maximum width existing in the third level with the length 2 (5,3).
Example 3:
Input:
1
/ \
3 2
/
5
Output: 2
Explanation: The maximum width existing in the second level with the length 2 (3,2).
Example 4:
Input:
1
/ \
3 2
/ \
5 9
/ \
6 7
Output: 8
Explanation:The maximum width existing in the fourth level with the length 8 (6,null,null,null,null,null,null,7).
Note: Answer will in the range of 32-bit signed integer.
方法1: bfs
思路:
/**
* 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:
int widthOfBinaryTree(TreeNode* root) {
if( !root ) return 0;
queue<pair<TreeNode*, int> > q;
q.push({root, 1 });
int ans = 0;
while(!q.empty() ){
int size = q.size();
if (size == 1){
q.push({q.front().first,1});
q.pop();
}
ans = max( q.back().second - q.front().second + 1, ans);
while( size-->0 ){
auto node = q.front().first;
auto idx = q.front().second;
q.pop();
if( node->left )
q.push({node->left, idx*2});
if( node->right )
q.push({node->right, idx*2+1});
}
}
return ans;
}
};
方法2:dfs
思路:
这个解法有overflow的问题。
class Solution {
public:
int widthOfBinaryTree(TreeNode* root) {
vector<int> lefts; // left most nodes at each level;
int maxwidth = 0;
dfs(root, 1, 0, lefts, maxwidth);
return maxwidth;
}
private:
void dfs(TreeNode* node, int id, int depth, vector<int>& lefts, int& maxwidth) {
if (!node) return;
if (depth >= lefts.size()) lefts.push_back(id); // add left most node
maxwidth = max(maxwidth, id + 1 - lefts[depth]);
dfs(node->left, id * 2, depth + 1, lefts, maxwidth);
dfs(node->right, id * 2 + 1, depth + 1, lefts, maxwidth);
}
};