#include<stdio.h>
#include<stdlib.h>
#define Null -1
#define Maxsize 11
struct que
{
int a[Maxsize];
int front;
int Rear;
};
typedef struct que* queue;//循环队列方便层序遍历
struct leaft
{
int left;
int right;
} T[10];
void addQ(queue q,int p);
int deleteQ(queue q);
int main()
{
int N,i,root;
char a,b;
queue q=(queue)malloc(sizeof(struct que));
scanf("%d\n",&N);
int M[N];
for(i=0;i<N;i++)
{
M[i]=0;
}
for(i=0;i<N;i++)
{
scanf("%c %c",&a,&b);
char ch=getchar();
if(a!='-')
{
T[i].left=a-'0';
M[T[i].left]++;
}
else
{
T[i].left=Null;
}
if(b!='-')
{
T[i].right=b-'0';
M[T[i].right]++;
}
else
{
T[i].right=Null;
}
}
for(i=0;i<N;i++)//寻找根节点
{
if(!M[i])
{
root=i;
break;
}
}
q->front=0;
q->Rear=0;
addQ(q,root);
while(q->Rear%Maxsize!=q->front)//层序遍历
{
int Te=deleteQ(q);
if(T[Te].right==Null&&T[Te].left==Null)
{
if(q->Rear%Maxsize==q->front)
{
printf("%d",Te);
}
else
printf("%d ",Te);
}
if(T[Te].left!=Null)
{
addQ(q,T[Te].left);
}
if(T[Te].right!=Null)
{
addQ(q,T[Te].right);
}
}
return 0;
}
void addQ(queue q,int p)
{
if((q->Rear+1)%Maxsize!=q->front)
{
q->Rear=(q->Rear+1)%Maxsize;
q->a[q->Rear]=p;
}
}
int deleteQ(queue q)
{
return q->a[++q->front];
}
写了挺久,然后bug也找了挺久,一直在提示我溢出,层序遍历大家一般用的都是循环队列吧,申请队列的时候我用了个野指针,这自然是兵家大忌(糊涂了),后来才发现自己动态申请了。
题目相对来说比较清晰,建树-寻找根节点-层序遍历-输出叶节点