这道题的难点在于如何实现树的层序遍历。查了一些资料,选择了较为简单的队列实现。其他的没什么特别难的点,比较基础。下面为实现代码:
#include<stdio.h>
#include<stdlib.h>
#define MAX 50
#define NULL -1
typedef struct QNode {
int front;
int rear;
int Data[MAX];
}Queue; //层序遍历所用的队列结点
typedef struct Tnode {
int left;
int right;
int num;
}Tree;
Tree T[MAX];
int findroot(Tree T[])//寻找根结点
{
int root;
int flag[MAX];
char cl, cr;
int N;
scanf("%d", &N);
if (N > 0)
{
for (int i = 0; i < N; i++)
flag[i] = 0;
for (int i = 0; i < N; i++)
{
scanf("\n%c %c", &cl, &cr);
T[i].num = i;
if (cl != '-')
{
T[i].left = cl - '0';
flag[T[i].left] = 1;
}
else
T[i].left = NULL;
if (cr != '-')
{
T[i].right = cr - '0';
flag[T[i].right] = 1;
}
else
T[i].right = NULL;
}
for (int i = 0; i < N; i++)
{
if (flag[i] == 0)
root = i;//已找到根节点
}
return root;
}
else
return NULL;
}
void Push(Queue *q, int root)
{
if (((q->rear + 1) % 50)== q->front)
{
printf("层序遍历队列满!");
return;
}
q->rear = (q->rear + 1) % MAX;
q->Data[q->rear] = root;
}
int Pop(Queue* q)
{
if (q->front == q->rear)
{
printf("层序遍历队列空!");
return NULL;
}
q->front = (q->front + 1) % MAX;
return q->Data[q->front];
}
void traversal(int root)//层序遍历,输出叶节点
{
int temp;
int count = 0;//输出空格,调整格式所用
struct QNode* q;
q = (struct QNode*)malloc(sizeof(struct QNode));
q->front = q->rear = 0;
if (root == NULL)
return;
Push(q, root);
while (q->front != q->rear)
{
temp = Pop(q);
if (T[temp].left == NULL&&T[temp].right == NULL)
{
if (count != 0)
{
printf(" ");
}
count = count + 1;
printf("%d", temp);
}
if (T[temp].left != NULL)
Push(q, T[temp].left);
if (T[temp].right != NULL)
Push(q, T[temp].right);
}
}
int main(void)
{
int root;
root = findroot(T);
traversal(root);
}