1

题目大意:

给定一颗树,要求求出每一层叶子结点的数目

算法思路:

直接遍历这颗树,在遇到叶子节点的时候,就统计当前层次下的叶子节点的个数,这里使用num_leaves_per_level保存每一层叶子节点的数目。遍历结束后,直接输出num_leaves_per_level数组即可。层序遍历代码如下:

int num_leaves_per_level[101];//每一层叶子节点的数目
int layer = -1;//层数

void levelTraverse(int root){
    queue<int> q;
    node[root].level = 1;
    q.push(root);
    while (!q.empty()){
        int t = q.front();
        q.pop();
        if(layer<node[t].level){
            layer = node[t].level;
        }
        if(node[t].child.empty()){
            // 叶子节点
            ++num_leaves_per_level[node[t].level];
        } else {// 这里得进行判断,不然会死循环
            for(auto &item:node[t].child){
                node[item].level = node[t].level+1;
                q.push(item);
            }
        }
    }
}

注意点:

  • 层序遍历的时候每次入队都是之前出队的节点的孩子节点不是$root$。否则会有测试点内存超限和超时。

提交结果:

image.png

AC代码:

#include <cstdio>
#include <vector>
#include <queue>

using namespace std;

struct Node{
    vector<int> child;
    int level;
}node[101];

int num_leaves_per_level[101];//每一层叶子节点的数目
int layer = -1;//层数

void levelTraverse(int root){
    queue<int> q;
    node[root].level = 1;
    q.push(root);
    while (!q.empty()){
        int t = q.front();
        q.pop();
        if(layer<node[t].level){
            layer = node[t].level;
        }
        if(node[t].child.empty()){
            // 叶子节点
            ++num_leaves_per_level[node[t].level];
        } else {// 这里得进行判断,不然会死循环
            for(auto &item:node[t].child){
                node[item].level = node[t].level+1;
                q.push(item);
            }
        }
    }
}

int main()
{
    int N,M;//节点总数和非叶节点个数
    scanf("%d %d",&N,&M);
    if(N==0) return 0;
    int ID,K;
    for (int i = 0; i < M; ++i) {
        scanf("%d %d",&ID,&K);
        if(K!=0){
            // 非叶子节点
            for (int j = 0; j < K; ++j) {
                int child;
                scanf("%d",&child);
                node[ID].child.push_back(child);
            }
        }
    }
    levelTraverse(1);
    for (int k = 1; k <= layer; ++k) {
        printf("%d",num_leaves_per_level[k]);
        if(k<layer) printf(" ");
    }
    return 0;
}

乔梓鑫
569 声望17 粉丝

主要分享个人学习经验和心得