题目粗心:

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

算法思路:

间接遍历这颗树,在遇到叶子节点的时候,就统计以后档次下的叶子节点的个数,这里应用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);            }        }    }}

留神点:

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

提交后果:

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;}