1004. Counting Leaves

题目信息:

1004

题目的意思是找出树中每一层的叶节点个数。
个人觉得难点在寻找每一层有哪些结点,或者说每一个结点在哪一层。题主的做法是用一个队列来帮助我们记录每一个叶节点的层数。
需要注意的是,输入的数据可能是乱序的,也就是头一列可能不是叶节点的,这个也是一个难点。

/* 题目:1004    */
/* 作者:ChanWunsam  */
/* 时间:2017.12.19  */
#include <cstdio>
#include <queue>
#include <vector>
#include <map>
#include <string>
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;

struct TNode{
  int childNum;
  int height;
  int *child;
};
struct TNode FMTree[101];

int main()
{
  int N, M, ID, childNum, childID, i, j, queue[101], front, rear, cnt[100], H, MaxH;
  cin>>N>>M;

  /* 初始化家庭树 */
  for(i=0; i<=N; i++)
  {
    FMTree[i].childNum=0;
    FMTree[i].height=0;
    cnt[i]=0;
  }

  /* 输入数据 */
  for(i=0; i<M; i++)
  {
    cin>>ID;
    cin>>childNum;
    FMTree[ID].childNum=childNum;
    //cout<<"ID:"<<ID<<" "<<FMTree[ID].height<<endl;

    FMTree[ID].child=(int *)malloc(childNum * sizeof(int));
    for(j=0; j<childNum; j++)
    {
      cin>>childID;
      FMTree[ID].child[j]=childID;
    }
  }

  /* 建立树层 */
  front=rear=0;
  queue[rear++]=1;      /* 根节点,很重要 */
  while(rear-front)
  {
    ID=queue[front++];
    for(i=0; i<FMTree[ID].childNum; i++)
    {
      j=FMTree[ID].child[i];
      queue[rear++]=j;
      FMTree[j].height=FMTree[ID].height+1; 
    }
  }

  /* 寻找无子树结点 */
  H=MaxH=0;
  for(i=1; i<=N; i++)
  {
    H=FMTree[i].height;
    if(!FMTree[i].childNum)
      cnt[H]++;
    if(H>MaxH)
      MaxH=H;
  }

  /* 输出值 */
  cout<<cnt[0];
  for(i=1; i<=MaxH; i++)
    cout<<" "<<cnt[i];

    return 0;
}

虽然时间复杂度依旧被暴捶,但是好在这算是题主真正意义上独立解决的一个问题(不过中间卡在了乱序的那个地方去寻找思路了),而且思路也和大佬们差不多。还是有点小满足的。

得分


上星期欠的债算是补了一部分了。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值