思路:使用队列进行层序遍历,并输出叶子节点。
详解见【第三讲 树(上)】-【3.3 二叉树的遍历】-【3.3.3 层序遍历】
#include <stdio.h>
#include <stdlib.h>
#pragma warning( disable : 4996 )
#define MAXSIZE 11
#define Null -1
struct Tree
{
int left;
int right;
}MyTree[MAXSIZE];
struct Queue
{
int data[MAXSIZE];
int front;
int rear;
};
typedef struct Queue* PtrQ;
// 将树存储于结构数组中,返回根节点下标
int BuildTree(struct Tree T[]);
// 初始化队列
PtrQ InitializeQ();
// 入队
void AddQ(PtrQ Q, int input);
// 出队
int DeleteQ(PtrQ Q);
int main()
{
int root = BuildTree(MyTree);
int out;
int IsFirst = 1;
PtrQ MyQueue;
MyQueue = InitializeQ();
AddQ(MyQueue, root);
while ( MyQueue->front != MyQueue->rear )// 只要队列不空就一直进行
{
out = DeleteQ(MyQueue);// 每次出队一个元素
if (MyTree[out].left != Null)
AddQ(MyQueue, MyTree[out].left);
if (MyTree[out].right != Null)
AddQ(MyQueue, MyTree[out].right);
if (MyTree[out].left == Null && MyTree[out].right == Null)
{
if (IsFirst)
{
IsFirst = 0;
printf("%d", out);
}
else
{
printf(" %d", out);
}
}
}
}
int BuildTree(struct Tree T[])
{
int NodeNum;
int check[MAXSIZE] = { 0 };
scanf("%d\n", &NodeNum);
char cl, cr;
for (int i = 0; i < NodeNum; i++)
{
scanf("\n%c %c", &cl, &cr);
if (cl == '-')
T[i].left = -1;
else
{
T[i].left = cl - '0';
check[ T[i].left ] = 1;
}
if (cr == '-')
T[i].right = -1;
else
{
T[i].right= cr - '0';
check[T[i].right] = 1;
}
}
for (int i = 0; i < NodeNum; i++)
{
if (!check[i])
return i;
}
}
PtrQ InitializeQ()
{
PtrQ Q = (PtrQ)malloc(sizeof(struct Queue));
Q->front = -1;
Q->rear = -1;
return Q;
}
void AddQ(PtrQ Q, int input)
{
if (Q->front == (Q->rear + 1) % MAXSIZE)
{
printf("%s", "Queue is full.");
return;
}
Q->rear = (Q->rear + 1) % MAXSIZE;
Q->data[Q->rear] = input;
}
int DeleteQ(PtrQ Q)
{
if (Q->front == Q->rear)
{
printf("%s", "Queue is empty.");
return -2;
}
Q->front = (Q->front + 1) % MAXSIZE;
return Q->data[Q->front];
}