题目:
二叉树的宽度指的是具有节点数目最多的那一层的节点个数。
1
/
2 3
/
4
答案为2, 第二层节点数最多,为2个节点。
输入格式
共n行。
第一行一个整数n,表示有n个结点,编号为1至n。(1<=n<=50)
第二行至第n行,每行有两个整数x和y,表示在二叉树中x为y的父节点。x第一次出现时y为左孩子
输出格式
输出二叉树的宽度。
输入样例
5
1 2
1 3
2 4
2 5
输出样例
2
思路:
利用一个结构体数组把层数是多少给存起来
同时构建树的时候把只出现过在第一个位置的数字记录下来当做根节点即可
注意一个细节就是n==1的时候输出1
(因为这个调了半小时emmmm)
具体看代码
AC代码:
#include <iostream>
using namespace std;
struct node{
int l,r;//左右孩子
int n;
};
node a[10000];
int m[100];
int ans[100];
void solve(int x,int cnt){//遍历
if(m[x]==0)return;//如果是0说明这个点是没出现过的
ans[cnt]++;//存层数答案
solve(a[x].l,cnt+1);
solve(a[x].r,cnt+1);
};
int main()
{
int n;
cin>>n;
if(n==1){
cout<<1<<endl;
return 0;
}
n--;
for(int i=0;i<n;i++){
int x,y;
cin>>x>>y;
m[x]++;//记录节点看是不是根节点
m[y]+=3;
if(a[x].l==0){
a[x].l=y;
}else a[x].r=y;
}
for(int i=1;i<=50;i++){
if(m[i]<=2&&m[i]!=0){//找根节点
solve(i,1);
break;
}
}
int mmax=0;
for(int i=1;i<=51;i++){//找最大宽度
mmax=max(mmax,ans[i]);
}
cout<<mmax;
return 0;
}