题意:按层次输出叶子节点
思路:由于数据都是小于10的整数,所以可以用数组存储二叉树,层次遍历二叉树则需要一个队列存储每一层的节点。遇到叶子节点就输出。
#include<stdio.h>
struct node{ //数组用来存储二叉树
int data;
int left;
int right;
}tr[10];
int main()
{
int N,i,M=0;
int check[10]={0};
scanf("%d",&N);
getchar(); //读入换行符
for(i=0;i<N;i++){
char l,r;
scanf("%c %c",&l,&r); //读入左右孩子
getchar();
if(l=='-'&&r=='-')M++; //叶子节点个数
tr[i].data=i; //节点数据
tr[i].left=l=='-'?-1:l-'0';
tr[i].right=r=='-'?-1:r-'0';
if(l!='-')check[l-'0']=1; //查找根节点
if(r!='-')check[r-'0']=1;
}
int queue[10]={0},rear=-1,front=-1; //设置队列,按层次输出
struct node p;
for(i=0;i<N;i++) //根节点
{
if(check[i]==0)queue[++rear]=i; //队尾插入根节点
}
while(front!=rear){ //队列不为空
p=tr[queue[++front]]; //队头取出节点
if(p.left!=-1)queue[++rear]=p.left; //队尾插入左孩子
if(p.right!=-1)queue[++rear]=p.right; //队尾插入右孩子
if(p.left==-1&&p.right==-1){ //输出叶子节点
printf("%d",p.data);
M--;
if(M)printf(" ");
}
}
return 0;
}