思路:宽度是同一层边缘节点之间的长度,所以需要记录节点的位置(宽度是在 int 范围内的,树可能是无限长的,,,试探 unsigned long long 可以或者计算子节点 pos 减去首节点的值从 0开始
dfs 记录最左非空节点位置
class Solution {
public:
void dfs(TreeNode* root, int height, unsigned long long pos, int &maxn, unordered_map<int, int> &height_left) {
if (root == nullptr) {
return;
}
if (!height_left.count(height)) {
height_left[height] = pos;
}
maxn = max(maxn, static_cast<int>(pos - height_left[height] + 1));
dfs(root->left, height + 1, pos*2, maxn, height_left);
dfs(root->right, height + 1, pos*2 + 1, maxn, height_left);
}
int widthOfBinaryTree(TreeNode* root) {
unordered_map<int, int> height_left;
int maxn = 0;
dfs(root, 1, 1, maxn, height_left);
return maxn;
}
};
bfs 非空节点入队,记录节点位置
class Solution {
public:
int widthOfBinaryTree(TreeNode* root) {
int maxn = 0;
queue<pair<TreeNode*, unsigned long long>> q;
if (root) {
q.push({root, 1});
}
while (!q.empty()) {
auto st = q.front();
int level_size = q.size();
for (int i = 0; i < level_size; ++i) {
auto tmp = q.front();
q.pop();
maxn = max(maxn, static_cast<int>(tmp.second - st.second + 1));
if (tmp.first->left) {
q.push({tmp.first->left, tmp.second * 2});
}
if (tmp.first->right) {
q.push({tmp.first->right, tmp.second * 2 + 1});
}
}
}
return maxn;
}
};