LeetCode 662
https://leetcode.cn/problems/maximum-width-of-binary-tree/description/
难度:中等
高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/
这道题类似二叉树层序遍历,但是除了要保留节点本身,还需要保留节点在本层的编号。对节点 i,左儿子为 2 * i,右儿子为 2 * i + 1。
另外,由于最大 3000 个节点,如果是一条只有右儿子的链,那么编号会达到 \(2^3000\),任何数据类型都会溢出,所以我们需要使用 unsigned long long 类型,当溢出后会重新回到 0,而不会报错。
时间复杂度:O(n),其中 n 是二叉树的节点个数。需要遍历所有节点。
空间复杂度:O(n)。广度优先搜索的空间复杂度最多为 O(n)。
class Solution {
public:
int widthOfBinaryTree(TreeNode* root) {
vector<pair<TreeNode*, unsigned long long>> cur;
cur.emplace_back(root, 0);
unsigned long long ans = 0;
while (cur.size() > 0) {
vector<pair<TreeNode*, unsigned long long>> nxt;
for (auto &[node, idx]: cur) {
if (node->left) {
nxt.emplace_back(node->left, idx * 2);
}
if (node->right) {
nxt.emplace_back(node->right, idx * 2 + 1);
}
}
ans = max(ans, cur.back().second - cur[0].second + 1);
cur = move(nxt);
}
return ans;
}
};