#include<iostream>
using namespace std;
#define MAX_TREE_SIZE 100
typedef struct{
char data;
int parent;
}PTNode;//结点定义
typedef struct{
PTNode nodes[MAX_TREE_SIZE];//结点类型的数组,用来存储所有结点
int n; //表示树中的结点数
}PTree; //树定义
//下面是统计结点的函数
//统计叶子结点不好统计,先统计非叶子结点,最后计算叶子
//当一个结点为另一个结点的父母结点时就是非叶结点
//一定要记住存储的表格!
int GetLeavesCount(PTree T){
int count=0;
for(int i=0;i<T.n;i++)
for(int j=0;j<T.n;j++){
if(i==j)//J每次从0开始,所以肯定能遍历到自己的位置
continue;
//如果某个结点的父母的值等于自己,那么自己就是非叶子
else if(T.nodes[j].parent==i){
count++;
break;
}
}
return T.n-count;
}
int main(){
cout<<"请输入树的结点个数"<<endl;
int n=0;
cin>>n;
PTree pt;
pt.n=n;
cout<<"输入每个结点信息"<<endl;
for(int i=0;i<n;i++){
cin>>pt.nodes[i].data>>pt.nodes[i].parent;
}
cout<<GetLeavesCount(pt)<<endl;
return 0;
}
vector建树
#include<algorithm>
using namespace std;
int main(){
int n;
while(cin>>n){
vector<int>tree[10000];
char data;
int parent;
/*vector下标为父母结点,值为孩子的下标,
所以头结点的父母结点应该为0,
也就是结点下标应该从1开始。*/
for(int i=1;i<=n;i++){
cin>>data>>parent;
tree[parent].push_back(i);//记录了每个节点的孩子数
}
int tot;//叶子结点个数
tot=0;
for(int i=1;i<=n;i++){//看看每个结点,谁的孩子为空
if((int)tree[i].size()==0){
tot++;
}
}
cout<<tot<<endl;
}
return 0;
}