1004 Counting Leaves

#include
using namespace std;
typedef struct _treeNode
{
int level;
int isLeaf;//1for yes,0 for no
int father;
}treeNode;
int dolevel(treeNode* tree,int N,int tmp){//求解tmp的level并返回
if(!tree[tmp].father){
return 1;
}
else{
return dolevel(tree,N,tree[tmp].father)+1;
}
}
int mk_tree(treeNode* tree,int &N,int &M){//N is total tree nodes,M is non-leaf nodes,返回最大层数
int node,child_num,level=0,id,k,tmpid,maxlevel=0;

for (int i = 0; i < 100; i++)
{
    tree[i].father=-1;
    tree[i].level=-1;
    tree[i].isLeaf=-1;
}

tree[1].isLeaf=1;//将根节点isleaf初始化为1,防止仅有一个节点情况
tree[1].father=0;

for(;M>0;M--){//逐个输入非叶节点
    cin>>id>>k;
    tree[id].isLeaf=0;//此处0表示必然不是叶子节点
    for(;k>0;k--){
        cin>>tmpid;
        tree[tmpid].father=id;
        if(tree[tmpid].isLeaf!=0)//仅当节点不确定时才置为1
        tree[tmpid].isLeaf=1;//1只表示是某个节点的子节点不一定是叶子
    }
}
for (int j = 1; j < 100; j++)
{
    if(tree[j].father!=-1){
        tree[j].level=dolevel(tree,N,j);
        maxlevel=tree[j].level>maxlevel?tree[j].level:maxlevel;
    }
}
return maxlevel;

}
int main(){
int N,M;
treeNodetree=NULL;
cin>>N>>M;
if(!N)cout<<“error-0”<<endl;
tree=new treeNode[100];
int l=mk_tree(tree,N,M);
int
leafnode_of_level=new intl+1;
for (int i = 1; i < 100; i++)
{
if(tree[i].level!=-1&&tree[i].isLeaf==1){
leafnode_of_level[tree[i].level]++;
}
}

cout<<leafnode_of_level[1];
for (int j = 2; j < l+1; j++)
{
   cout<<" "<<leafnode_of_level[j];
}
free(tree);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值