Counting Leaves (DFS和BFS解法)

原題鏈接

PAT 甲級 1004

解題思路

這道題目是求樹的每一層上的葉子節點個數。

整一個leaf[]數組記錄每一層的結點個數
DFS或者BFS樹,在遍歷過程中記錄結點的層數(或者說高度),如果該結點爲葉子節點,就把該層次(深度)的leaf值++。

我寫DFS和BFS的習慣這幾題可以看出是一模一樣的,DFS中把結點的層次或者深度作爲參數傳遞,BFS把層數或者深度作爲結點結構體中的成員變量。找到自己喜歡的寫法就好了。

源代碼

BFS

#include<iostream>
#include<vector>
#include<queue>
using namespace std;
const int maxn=110;
struct node{
	int depth;
	vector<int> child;
}tree[maxn];
int n,m;
int cnt[maxn];
int maxDepth = 0;
void BFS(int root){
	queue<int> q;
	q.push(root);
	while(!q.empty()){
		int top = q.front();
		q.pop();
		if(tree[top].depth > maxDepth){
			maxDepth = tree[top].depth;
		}
		if(tree[top].child.size() == 0){
			cnt[tree[top].depth] ++;
		}
		for(int i=0; i<tree[top].child.size(); i++){
			int child  = tree[top].child[i];
			tree[child].depth = tree[top].depth+1;
			q.push(child); 
		}
	}
}
int main(){
    fill(cnt, cnt+maxn, 0);
    scanf("%d%d",&n,&m);
    if(n==0)
        return 0;
    int father, num, child;
    for(int i=0; i<m; i++){
        scanf("%d%d",&father,&num);
        for(int j=0; j<num; j++){
            scanf("%d",&child);
            tree[father].child.push_back(child);
        }
    }
    tree[1].depth = 1;
    BFS(1);
    for(int i=1; i<=maxDepth; i++)
    {
        printf("%d",cnt[i]);
        if(i<maxDepth)
            printf(" ");
    }
    return 0;
}

DFS

#include<iostream>
#include<vector>
using namespace std;
const int maxn=110;
vector<int> tree[maxn];
int n,m;
int cnt[maxn];
int maxDepth = 0;
void DFS(int index, int depth)//當前結點編號和深度
{
    if(tree[index].size()==0)
    {
        cnt[depth]++;
        if(depth>maxDepth)
            maxDepth=depth;
    }
    for(int i=0; i<tree[index].size(); i++)
    {
        int child=tree[index][i];
        DFS(child,depth+1);
    }
}
int main()
{
    fill(cnt, cnt+maxn, 0);
    scanf("%d%d",&n,&m);
    if(n==0)
        return 0;
    int father, num, child;
    for(int i=0; i<m; i++)
    {
        scanf("%d%d",&father,&num);
        for(int j=0; j<num; j++)
        {
            scanf("%d",&child);
            tree[father].push_back(child);
        }
    }
    DFS(1,1);
    for(int i=1; i<=maxDepth; i++)
    {
        printf("%d",cnt[i]);
        if(i<maxDepth)
            printf(" ");
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章