### 思路
1. 使用广度优先搜索(BFS)遍历二叉树,记录每一层的节点数。
2. 使用队列来实现BFS,队列中存储节点和其对应的层数。
3. 在遍历过程中,更新每一层的节点数,并记录最大节点数。
### 伪代码
1. 定义二叉树节点结构 `TreeNode` 和二叉树指针 `Tree`.
2. 定义 `CreateTree` 函数:
- 读取输入,构造二叉树。
3. 定义 `TreeWidth` 函数:
- 使用队列进行BFS遍历。
- 记录每一层的节点数,并更新最大节点数。
4. 在 `main` 函数中:
- 调用 `CreateTree` 构造二叉树。
- 调用 `TreeWidth` 计算二叉树的宽度。
- 输出二叉树的宽度。
### C++代码
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
TreeNode* CreateTree(int n, vector<pair<int, int>>& edges) {
vector<TreeNode*> nodes(n + 1, nullptr);
for (int i = 1; i <= n; ++i) {
nodes[i] = new TreeNode(i);
}
for (auto& edge : edges) {
int parent = edge.first;
int child = edge.second;
if (!nodes[parent]->left) {
nodes[parent]->left = nodes[child];
} else {
nodes[parent]->right = nodes[child];
}
}
return nodes[1];
}
int TreeWidth(TreeNode* root) {
if (!root) return 0;
queue<pair<TreeNode*, int>> q;
q.push({root, 0});
vector<int> level_count(51, 0); // Since n <= 50
int max_width = 0;
while (!q.empty()) {
auto node = q.front().first;
int level = q.front().second;
q.pop();
level_count[level]++;
max_width = max(max_width, level_count[level]);
if (node->left) q.push({node->left, level + 1});
if (node->right) q.push({node->right, level + 1});
}
return max_width;
}
int main() {
int n;
cin >> n;
vector<pair<int, int>> edges(n - 1);
for (int i = 0; i < n - 1; ++i) {
cin >> edges[i].first >> edges[i].second;
}
TreeNode* root = CreateTree(n, edges);
cout << TreeWidth(root) << endl;
return 0;
}