版权声明:蒟蒻的博客,留个链接就是了…… https://blog.csdn.net/qq_42817441/article/details/89279499
题目传送门
题目描述 Description
给出一个二叉树,输出它的最大宽度和高度。
输入描述 Input Description
第一行一个整数n。
下面n行每行有两个数,对于第i行的两个数,代表编号为i的节点所连接的两个左右儿子的编号。如果没有某个儿子为空,则为0。
输出描述 Output Description
输出共一行,输出二叉树的最大宽度和高度,用一个空格隔开。
样例输入 Sample Input
5
2 3
4 5
0 0
0 0
0 0
样例输出 Sample Output
2 3
数据范围及提示 Data Size & Hint
默认第一个是根节点
以输入的次序为编号
2-N+1行指的是这个节点的左孩子和右孩子
注意:第二题有极端数据!
1
0 0
这题你们别想投机取巧了,给我老老实实搜!
思路
恩, 是真理。
但,也可以 QAQ
就是每当读到一个点就更新最大宽度和高度。
最后输出不就得了吗??
说一下
代码
#include<bits/stdc++.h>
using namespace std;
struct node{
int l,r; //左右孩子
int deep; //节点的深度
}a[1000005];
int k[1000005]; //当前层数(deep)的宽度
int main()
{
/* freopen("t5.in","r",stdin);
freopen("t5.out","w",stdout);*/
int n;
scanf("%d",&n);
if(n<=0){
printf("0 0\n");
return 0;
}
int max_deep=1,max_k=1;;
a[1].deep=1;k[1]=1;
int x,y;
register int i;
for(i=1;i<=n;i++){
cin>>x>>y;
a[i].l=x,a[i].r=y;
/*处理左孩子*/
if(a[i].l!=0){
/*深度*/
a[a[i].l].deep=a[i].deep+1;
max_deep=max(max_deep,a[a[i].l].deep);
/*宽度*/
k[a[a[i].l].deep]++;
max_k=max(max_k,k[a[a[i].l].deep]);
}
/*处理右孩子*/
if(a[i].r!=0){
/*深度*/
a[a[i].r].deep=a[i].deep+1;
max_deep=max(max_deep,a[a[i].r].deep);
/*宽度*/
k[a[a[i].r].deep]++;
max_k=max(max_k,k[a[a[i].r].deep]);
}
}
printf("%d %d\n",max_k,max_deep);
return 0;
}