问题 B: 树的高度

题目描述
一棵树有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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值