主要思想先建树,然后利用队列进行层序遍历,在遍历过程中判断是否为叶子节点
#include<stdio.h>
#include <stdlib.h>
#define left 0//左节点
#define right 1//右节点
int main(){
int n;
char c[10][2];//数组建树
int IfRoot[10]={0};//寻找根节点
int root=-1;//初始化根位置
scanf("%d\n",&n);
for(int i=0;i<n;i++){
scanf("%c %c\n",&c[i][left],&c[i][right]);
if(c[i][left]>='0'||c[i][left]<='9')IfRoot[c[i][left]-'0']++;
if(c[i][right]>='0'||c[i][right]<='9')IfRoot[c[i][right]-'0']++;
}
for(int i=0;i<n;i++)if(!IfRoot[i]){root=i;break;}//根节点位置录入至root
// for(int i=0;i<n;i++)printf("%d ",IfRoot[i]);
// printf("\n");
// for(int i=0;i<n;i++){
// for(int j=0;j<2;j++){
// printf("%c",c[i][j]);
// printf(" ");
// }
// printf("\n");
// }判断数据是否读入且是否合理
int *queue=malloc(sizeof(int)*105);//模拟队列
int *leaves=malloc(sizeof(int)*105);//叶子结点数组
int cnt=0;//叶子节点数量
int front=0,rear=0;//队列 头指针 尾指针
queue[rear++]=root;//队列存入根节点
while(rear>front){
// printf("now 1st root is %d\n",root);
if(c[root][left]!='-')queue[rear++]=c[root][left]-'0';//左节点入队列
if(c[root][right]!='-')queue[rear++]=c[root][right]-'0';//右节点入队列
if(c[root][left]=='-'&&c[root][right]=='-')leaves[cnt++]=root;//该节点为叶子节点 入叶子结点数组
front++;//该节点上述已执行 进行下一节点判断
if(front!=rear)//防止溢出+更换根节点
root=queue[front];
// for(int i=0;i<rear;i++)printf("%d ",queue[i]);
// printf("\n");
}
for(int i=0;i<cnt-1;i++)printf("%d ",leaves[i]);
printf("%d",leaves[cnt-1]);//无尾空格输出
}