题目描述
大意是给出一个二叉树,要求按照层序遍历的顺序输出其所有叶子节点
第一个数字代表节点数,其后的第i行输入用例代表第i个节点(0 <= i < n-1),每行的数字代表该行对应节点的子树的根节点
此题整体上比较简单,主要是练习这种输入格式对应的静态链表栽树和层序遍历操作
#include <stdio.h>
#include <stdlib.h>
#define N 15
#define null -1
typedef struct BITREE
{
int num;//节点编号
int lchild;
int rchild;
}BITREE;
typedef struct QUEUE
{
BITREE TREE[N];
int front;//指向第一个元素
int rear;//rear指向最后元素后一个位置
}QUEUE;
BITREE tree[N];
void InitQueue(QUEUE *q)
{
q->front=q->rear=0;
}
void EnterQueue(QUEUE *q,BITREE TNODE)//入队
{
if((q->rear+1)%N == q->front)
printf("队满\n");
else
{
q->TREE[q->rear].lchild=TNODE.lchild;
q->TREE[q->rear].rchild=TNODE.rchild;
q->TREE[q->rear].num=TNODE.num;
q->rear=(q->rear+1)%N;
}
}
BITREE DeleteQueue(QUEUE *q)//出队
{
if(q->rear == q->front)
printf("队空\n");
else
{
int i=q->front;
q->front=(q->front+1)%N;
return q->TREE[i];
}
}
int CreateTree(int n)//栽树
{
int i=-1;
int check[N]={0};
char lc,rc;
if(n)
{
for(i=0;i<n;i++)
{
scanf(" %c %c",&lc,&rc);
getchar();
tree[i].num=i;
if(lc!='-')
{
tree[i].lchild=(int)(lc-'0');
check[tree[i].lchild]=1;
}
else
tree[i].lchild=null;
if(rc!='-')
{
tree[i].rchild=(int)(rc-'0');
check[tree[i].rchild]=1;
}
else
tree[i].rchild=null;
}
for(i=0;i<n;i++)
if(!check[i])
break;
}
return i;
}
void LevelorderTraversal(QUEUE *q,int root)//层序遍历输出结果
{
BITREE t;
EnterQueue(q,tree[root]);
for(;q->front!=q->rear;)//队列非空
{
t=DeleteQueue(q);
if(t.lchild == null && t.rchild == null)
{
printf("%d",t.num);
if(q->front != q->rear)//格式输出
printf(" ");
}
if(t.lchild!=null)
EnterQueue(q,tree[t.lchild]);
if(t.rchild!=null)
EnterQueue(q,tree[t.rchild]);
}
}
int main()
{
int n;
int r;
QUEUE q;
InitQueue(&q);
scanf("%d",&n);
r=CreateTree(n);
LevelorderTraversal(&q,r);
return 0;
}