Codevs 1501 二叉树最大的宽度和高度 题解
题目:输入N行,每行存在2个数,分别为i节点所连接的左右节点的编号。若没有,则为0。
输出此棵二叉树的最大宽度和高度。
输入: 输出:
5 2 3
2 3
4 5
0 0
0 0
0 0
分析:一道看似很水的有关二叉树遍历的题,可以尝试通过DFS操作。
通过DFS建立一棵隐性二叉树,便于查询。
从末尾开始向根节点进行DFS,比较最大宽度与高度。
代码如下:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int arr[51],m[51];
int main()
{
int deep=0,wide=0;
int N;
cin >> N;
for(int i=1;i<=N;i++)
{
int left,right;
scanf("%d %d",&left,&right);
arr[left]=i,arr[right]=i;
}
for(int i=1;i<=N;i++)
{
int k=1,sum=arr[i];
while( sum!=0 )//存在此节点
{
k++;
sum=arr[sum];//向上寻找父节点
}
m[k]++;//k节点的累加宽度
deep=max(deep,k);//最大的高度
wide=max(wide,m[k]);//最大的宽度
}
cout << wide <<' ' << deep;
return 0;
}
左岸夜亦冷
2018.4.27