1501 二叉树最大宽度和高度
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 白银 Silver
题目描述 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
n<16
默认第一个是根节点
以输入的次序为编号
2-N+1行指的是这个节点的左孩子和右孩子
注意:第二题有极端数据!
1
0 0
这题你们别想投机取巧了,给我老老实实搜索!
#include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #define N 1100 using namespace std; int n,ans1,ans2,fa[N],deep[N],width[N]; int read() { int x=0,f=1; char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1; ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘; ch=getchar();} return x*f; } struct W { int l,r; }w[N]; void dfs(int now) { deep[now]=deep[fa[now]]+1; ans2=max(ans2,deep[now]); width[deep[now]]++; if(w[now].l) dfs(w[now].l); if(w[now].r) dfs(w[now].r); } int main() { n=read();fa[1]=0; for(int i=1;i<=n;i++) { w[i].l=read(),w[i].r=read(); fa[w[i].l]=i,fa[w[i].r]=i; } dfs(1); for(int i=1;i<=n;i++) ans1=max(ans1,width[i]); printf("%d %d",ans1,ans2); }
时间: 2024-11-15 16:59:51