输入:一棵二叉树的根节点 root。
要求:返回这棵二叉树的 最大宽度。宽度定义为:在同一层中,最左非空节点和最右非空节点之间的(逻辑)节点数量。
输出:一个整数,表示最大宽度。
思路:层序遍历 + 给每个节点分配“完全二叉树编号”。
把真实二叉树当成一棵“隐式完全二叉树”,这样做的好处是不需要真的补全 null 节点,但能够模拟完整结构,从而正确计算每一层的最左、最右逻辑位置。
按照下面这种方式给节点编号:
-
root 的编号是 1
-
左孩子编号 =
idx * 2 -
右孩子编号 =
idx * 2 + 1
对于某一层,我们记录:
-
start:该层第一个节点的编号
-
end:该层最后一个节点的编号
该层宽度 = end - start + 1,一层一层更新最大值即可。
复杂度:
时间复杂度:O(n)
空间复杂度:O(n)
class Solution {
public:
int widthOfBinaryTree(TreeNode* root) {
if (!root) return 0;
queue<pair<TreeNode*, unsigned long long>> q;
q.push({root, 1});
int ans = 0;
while (!q.empty()) {
int n = q.size();
unsigned long long start = 0, end = 0;
for (int i = 0; i < n; i++) {
auto [node, idx] = q.front();
q.pop();
if (i == 0) start = idx;
if (i == n - 1) end = idx;
if (node->left) q.push({node->left, idx * 2});
if (node->right) q.push({node->right, idx * 2 + 1});
}
ans = max(ans, (int)(end - start + 1));
}
return ans;
}
};
835

被折叠的 条评论
为什么被折叠?



