codevs 1501 二叉树最大宽度和高度

版权声明:蒟蒻的博客,留个链接就是了…… 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

n < 1 0 6  当时就把我坑到了 \color{red}n<10^6\color{blue}\text{ 当时就把我坑到了}

默认第一个是根节点

以输入的次序为编号

2-N+1行指的是这个节点的左孩子和右孩子

注意:第二题有极端数据!
1
0 0
这题你们别想投机取巧了,给我老老实实搜!

思路

恩, 老老实实搜 \color{red}\text{老老实实搜} 是真理。

,也可以 投机取巧 \color{green}\text{投机取巧} QAQ

就是每当读到一个点就更新最大宽度和高度。

最后输出不就得了吗??

说一下

最大宽度要一层层地记! \color{red}\text{最大宽度要一层层地记!}

最大宽度要一层层地记! \color{blue}\text{最大宽度要一层层地记!}

最大宽度要一层层地记! \color{green}\text{最大宽度要一层层地记!}

代码

#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;
}

猜你喜欢

转载自blog.csdn.net/qq_42817441/article/details/89279499