题目描述
一棵树有n个节点,其中1号节点为根节点。
输入
第一行是整数n,表示节点数
后面若干行,每行两个整数a b,表示b是a的子节点。
输出
求这棵树的高度(根节点为第1层)
样例输入 Copy
5
1 2
1 3
3 4
3 5
样例输出 Copy
3
一开始做题,没看懂是怎么读入各个结点的,题目中给出了结点的个数n,后面若干行,每行两个整数a b,表示b是a的子节点。这里并没有说清楚输入多少个a和b,但是后来想了想,可以用while循环,在输入的a,b中如果输入了n个结点了,就停止读入。作为分支的结点可能在a,b对中出现好几次,但是作为叶子的结点却只出现一次,而b是a的子结点,因此可能在某次输入完a,b后树中的结点数目达到了n个,这时停止接收输入即可。作为子结点的b既然出现在了第n个,说明它是叶子结点,也就只出现这一次了,因此这时可以停止接收输入。
接下来是对输入数据的处理,我感觉自己的处理过程很麻烦,但是没有超时。。。
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{
map<int,vector<int> >p;
int flag=0;
vector<int>t1,t2;
int n,i,deep,a,b,j;
scanf("%d",&n);
if(n==1)printf("1\n");
else
{
deep=1;
map<int,int>number;
while(scanf("%d %d",&a,&b)!=EOF)
{
p[a].push_back(b);
number[a]++;
number[b]++;
if(number.size()==n)break;
}//输入结束
if(p[1].size()!=0)//从1开始把与1相关的结点存在vector中
{
deep++;
flag=1;
for(i=0; i<p[1].size(); i++)
t1.push_back(p[1][i]);
}
while(flag)
{
for(i=0; i<t1.size(); i++)//从t1中取出每个数,找每个数是否还关联有结点,将关联的结点放入t2
{
if(p[t1[i]].size()!=0)
{
flag=1;
for(j=0; j<p[t1[i]].size(); j++)
t2.push_back(p[t1[i]][j]);
}
}
if(t2.size()==0)flag=0;//如果在t2中没有存入元素,也就是上一批结点没有子结点,说明访问完了,退出
if(flag==1)
{
deep++;//上一批结点有子结点,深度加一
t1.clear();
for(i=0; i<t2.size(); i++)//将t2的元素放到t1
{
t1.push_back(t2[i]);
}
t2.clear();
}
}
printf("%d\n",deep);
}
return 0;
}