PAT (Advanced Level) Practice 1004 Counting Leaves

 1、不是二叉樹,存儲方式用到了代碼中的結構體。

 2、因爲結點編號在100以內,可以讓第i個結點就存儲在tree[i]中,方便查找

 3、方法:建樹然後層序遍歷,遍歷時記錄layer,和當層無葉子結點的結點個數

 注意:這題題目有個:The input ends with N being 0. That case must NOT be processed.

 我以爲輸入的N爲0時,不進行處理,結果加不加判斷都能A,所以也不知道給這個說明是來幹嘛的,另外,題目本身就說明了N是不可能等於0的。

#include <iostream>
#include <stdio.h>
#include <vector>
#include <queue>
using namespace std;
struct Node{
    int data;
    int layer;
    vector<int> child;
};
struct Node tree[100];
int n,m;
vector<int> result;

void layer(){
    queue<int> q;//tree 的下標
    q.push(1);
    tree[1].layer = 0;
    int layer =0;
    int sum = 0;
    while(!q.empty()){
        int i = q.front();
        q.pop();
        if(tree[i].layer != layer){//層次切換時存儲上一層結果
            layer = tree[i].layer;
            result.push_back(sum);
            sum=0;
        }
        if(tree[i].child.size() != 0){
            for(int j=0;j<tree[i].child.size();j++){
                int h = tree[i].child[j];
                tree[h].layer = tree[i].layer+1;
                q.push(h);
            }
        }else{
            sum++;
        }
    }
    //最後的一層
    result.push_back(sum);
}
int main()
{
    scanf("%d",&n);
    if(n == 0) return 0;
    scanf("%d",&m);
    int index,num,c;
    for(int i=0;i<m;i++){
        scanf("%d",&index);
        int num;
        scanf("%d",&num);
        for(int j=0;j<num;j++){
            int ch;
            scanf("%d",&ch);
            tree[index].child.push_back(ch);
        }
    }
    layer();

    for(int i=0;i<result.size();i++){
        printf("%d",result[i]);
        if(i!=result.size()-1) printf(" ");
    }
    printf("\n");
    return 0;
}

 

發佈了79 篇原創文章 · 獲贊 52 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章