#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define N 200000 + 5
int n, m, rt, cnt, Deg[N], Leaf[N];
vector<int> Vec[N];
void dfs(int z, int fa)//fa记录上一个节点的编号,即判断是否经过
{
if (Deg[z] == 1)
Leaf[++ cnt] = z;
for (int d : Vec[z])
if (d != fa)
dfs(d, z);
}
int main()
{
scanf("%d", &n);
for (int i = 1, u, v; i < n; i ++)
{
scanf("%d%d", &u, &v);
Vec[u].push_back(v);
Vec[v].push_back(u);
Deg[u] ++, Deg[v] ++;
}
for (int i = 1; !rt && i <= n; i ++)/求根,第一个度大于1的节点即可当作根
if (Deg[i] > 1)
rt = i;
dfs(rt, 0);
m = (cnt + 1) / 2;
printf("%d\n", m);
for (int i = 1; i * 2 <= cnt; i ++)
printf("%d %d\n", Leaf[i + m], Leaf[i]);
if (cnt & 1)
printf("%d %d\n", rt, Leaf[m]);
return 0;
}
树的dfs找叶子节点
最新推荐文章于 2023-04-26 21:16:16 发布