1004. Counting Leaves (30)-PAT甲級真題(bfs,dfs,樹的遍歷,層序遍歷)
A family hierarchy is usually presented by a pedigree tree. Your job is to count those family members who have no child.
Input
Each input file contains one test case. Each case starts with a line containing 0 < N < 100, the number of nodes in a tree, and M (< N), the number of non-leaf nodes. Then M lines follow, each in the format:
ID K ID[1] ID[2] ... ID[K]
where ID is a two-digit number representing a given non-leaf node, K is the number of its children, followed by a sequence of two-digit ID's of its children. For the sake of simplicity, let us fix the root ID to be 01.
Output
For each test case, you are supposed to count those family members who have no child for every seniority level starting from the root. The numbers must be printed in a line, separated by a space, and there must be no extra space at the end of each line.
The sample case represents a tree with only 2 nodes, where 01 is the root and 02 is its only child. Hence on the root 01 level, there is 0 leaf node; and on the next level, there is 1 leaf node. Then we should output "0 1" in a line.
Sample Input
2 1
01 1 02
Sample Output
0 1
生詞
英文 | 解釋 |
---|---|
family hierarchy | 家庭等級 |
pedigree tree | 族譜 |
The input ends with N being 0. | 輸入以N為0結束。 |
seniority | 年長 |
every seniority level | 每一層次 |
題目大意:
給出一棵樹,問每一層各有多少個葉子結點~
分析:
可以用dfs也可以用bfs~如果用dfs,用二維陣列儲存每一個有孩子結點的結點以及他們的孩子結點,從根結點開始遍歷,直到遇到葉子結點,就將當前層數depth的book[depth]++;標記第depth層擁有的葉子結點數,最後輸出~
原文連結:https://blog.csdn.net/liuchuo/article/details/52214833
DFS題解
#include <bits/stdc++.h>
using namespace std;
const int N=110;
vector<int> G[N]; //存放樹
int leaf[N]={0}; //存放每層的葉子結點個數
int max_h=1; //樹的深度
void DFS(int index,int h) //index為當前遍歷到的結點編號,h為當前深度
{
max_h=max(h,max_h);
if(G[index].size()==0){ //如果該結點是葉子結點
leaf[h]++;
return;
}
for(int i=0;i<G[index].size();i++){ //列舉所有子結點
DFS(G[index][i],h+1);
}
}
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int n,m,parent,child,k;
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
{
scanf("%d%d",&parent,&k); //父結點編號及子結點個數
for(int j=0;j<k;j++){
scanf("%d",&child);
G[parent].push_back(child); //加邊
}
}
DFS(1,1); //初始入口為跟結點與第一層
printf("%d",leaf[1]);
for(int i=2;i<=max_h;i++){
printf(" %d",leaf[i]);
}
return 0;
}
BFS題解
#include <bits/stdc++.h>
using namespace std;
const int N=110;
vector<int> G[N]; //存放樹
int h[N]; //各結點所處的層號,從1開始
int leaf[N]; //存放每層的葉子結點個數
int max_h; //樹的最大深度
void BFS()
{
queue<int> Q;
Q.push(1); //將根結點壓入佇列
while(!Q.empty()){
int id=Q.front(); //彈出隊首結點
Q.pop();
max_h=max(max_h,h[id]); //更新最大深度
if(G[id].size()==0){ //如果該結點是葉子結點
leaf[h[id]]++;
}
for(int i=0;i<G[id].size();i++){ //列舉所有子結點
h[G[id][i]]=h[id]+1; //子結點編號為G[id][i]
Q.push(G[id][i]); //將子結點壓入佇列
}
}
}
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int n,m,parent,child,k;
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
{
scanf("%d%d",&parent,&k); //父結點編號及子結點個數
for(int j=0;j<k;j++){
scanf("%d",&child);
G[parent].push_back(child); //加邊
}
}
h[1]=1; //初始化根節點
BFS(); //BFS入口
printf("%d",leaf[1]);
for(int i=2;i<=max_h;i++){
printf(" %d",leaf[i]);
}
return 0;
}
本文來自部落格園,作者:勇往直前的力量,轉載請註明原文連結:https://www.cnblogs.com/moonlight1999/p/15515346.html