二叉树的最大宽度
1. LeetCode 662. Maximum Width of Binary Tree
2. 描述
给定一颗二叉树,计算该二叉树的最大宽度。二叉树的宽度是指所有层的最大宽度。 二叉树每一层的宽度是指最左侧和最右侧的节点之间的距离,而二者之间的nullptr节点也被包含在内。
3. 示例
示例1:
输入
1
/ \
3 2
/ \ \
5 3 9
输出: 4
解释:该树的最大宽度位于第三层(5, 3, null, 9), 长度为4
示例2:
输入:
1
/
3
/ \
5 3
输出: 2
解释:该二叉树的最大宽度位于第三层(5,3),长度为2
4. 解题思路
分别记录每层最左侧的节点和最右侧节点的索引,然后使用DFS遍历所有的节点,在该过程中需要对所有的节点进行编号,左节点编号为 2 * i, 右子节点值为 2 * i + 1。
5. 解决方案:
void WidthOfBinaryTree(TreeNode* root, int depth,int order, vector<pair<int,int>>& ends){
if(root == nullptr){
return;
}
if(depth == ends.size()){
ends.push_back(make_pair(order,order));
}
ends[depth].first = min(order,ends[depth].first);
ends[depth].second = max(order,ends[depth].second);
WidthOfBinaryTree(root->left, depth + 1, 2* order, ends);
WidthOfBinaryTree(root->right, depth + 1, 2 * order +1 , ends);
}
int widthOfBinaryTree(TreeNode* root) {
if(root == nullptr){
return 0;
}
vector<pair<int,int>> ends;
WidthOfBinaryTree(root,0,1,ends);
int max_len = 0;
for(auto end: ends){
int len = end.second - end.first + 1;
max_len = max(len, max_len);
}
return max_len;
}