PAT 甲级 1004 Counting Leaves 树的层次遍历

在这里插入图片描述

代码如下:

#include<iostream>
#include<queue>
#include<stdio.h>
using namespace std;

int level[105];//记录每一层的叶子结点个数,也就是最后要输出的结果
struct node{
  int child_num;//每个结点的子结点数量
  int child[105];//记录每个结点的子结点编号
  int level;//结点的深度
  node(){//结构体构造函数
    for(int i=0;i<105;i++){
        child[i]=0;
    }
    child_num=0;
  }
}tree[105];

int level_order(){//层次遍历
  for(int i=0;i<105;i++){//level数组初始化
    level[i]=0;
  }
  queue<node> q;
  int max_level=-1;//树的最大深度
  tree[1].level=0;//根结点的深度为0
  q.push(tree[1]);
  while(!q.empty()){
    node a=q.front();
    q.pop();
    if(a.level>max_level){
        max_level=a.level;//更新树的最大深度
    }
    if(a.child_num==0){//若这个结点没有子结点,则level数组加1
        level[a.level]++;
    }else{
        for(int i=0;i<a.child_num;i++){
          tree[a.child[i]].level=a.level+1;//子结点的深度加1
          q.push(tree[a.child[i]]);
        }
    }
  }
  return max_level;//返回树的最大深度
}

int main(){
  int n,m;//n为树的结点总个数,m为叶子结点个数
  int num;//非叶结点的子结点个数
  int id;//每个结点的编号
  cin>>n>>m;
  for(int i=0;i<m;i++){
    cin>>id>>num;//读入每一个非叶结点的id以及其子结点的个数
    tree[id].child_num=num;
    for(int j=0;j<num;j++){//读入其所有子结点的编号
        cin>>tree[id].child[j];
    }
  }

  int max_level=level_order();//max_level为树的最大深度
  for(int i=0;i<=max_level;i++){//输出level数组
    if(i!=max_level){
      cout<<level[i]<<' ';
    }else{
      cout<<level[i];
    }
  }
  return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44123362/article/details/89376786