代码实现
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 10
#define MaxTree 10
#define ElementType int
#define Tree int
#define Null -1
struct TreeNode
{
ElementType data;
Tree Left;
Tree Right;
} T1[MaxTree], T2[MaxTree];
struct QNode {
ElementType data[MaxSize];
int rear;
int front;
};
typedef struct QNode* Queue;
Tree BuildTree( struct TreeNode T[] );
void LevelOrderTraversal( Tree R );
Queue CreateQ();
void AddQ( Queue PtrQ, ElementType item);
ElementType DeleteQ( Queue PtrQ );
int isEmpty(Queue Q);
int main()
{
LevelOrderTraversal(BuildTree(T1));
return 0;
}
Tree BuildTree( struct TreeNode T[] )
{
int i, N;
int* check;
char l, r;
Tree Root;
Root = Null;
scanf("%d", &N);
check = (int*)malloc(sizeof(int)*N);
for ( i=0; i<N; i++ ) check[i] = 0;
if ( N ) {
for ( i=0; i<N; i++ ) {
T[i].data = i;
scanf("\n%c %c", &l, &r);
if ( l != '-' ) {
T[i].Left = l-'0';
check[T[i].Left] = 1;
} else {
T[i].Left = Null;
}
if ( r != '-' ) {
T[i].Right = r-'0';
check[T[i].Right] = 1;
} else {
T[i].Right = Null;
}
}
for ( i=0; i<N; i++ ) {
if ( !check[i] ) break;
}
Root = i;
}
return Root;
}
void LevelOrderTraversal( Tree R ) //层序遍历
{
int flag=0;
Tree T;
Queue Q;
if ( !T1 ) return;
Q = CreateQ();
AddQ( Q, R );
while ( !isEmpty(Q) ) {
T = DeleteQ( Q );
if ( T1[T].Left == Null && T1[T].Right == Null )
{
if ( flag ) printf(" ");
printf("%d", T1[T].data);
flag++;
}
//printf("%d ", T1[T].data);
if ( T1[T].Left != Null ) AddQ( Q, T1[T].Left);
if ( T1[T].Right != Null ) AddQ( Q, T1[T].Right);
}
}
Queue CreateQ()
{
int i;
Queue Q;
Q = (Queue)malloc(sizeof(struct QNode));
for ( i=0; i<MaxSize; i++ ) {
Q->data[i] = Null;
}
Q->front = 0;
Q->rear = 0;
return Q;
}
void AddQ( Queue PtrQ, ElementType item)
{
if ( (PtrQ->rear+1)%MaxSize == PtrQ->front ) {
printf("队列满");
return;
}
PtrQ->rear= (PtrQ->rear+1)%MaxSize;
PtrQ->data[PtrQ->rear] = item;
}
ElementType DeleteQ( Queue PtrQ )
{
if ( PtrQ->front == PtrQ->rear ) {
printf("队列空");
return Null;
} else {
PtrQ->front = (PtrQ->front+1)%MaxSize;
return PtrQ->data[PtrQ->front];
}
}
int isEmpty(Queue Q)
{
if ( Q->rear == Q->front ) return 1;
else return 0;
}
思路
首先明确要用树的层次遍历的方法进行遍历(因为这个算是比较简单的方法了,最开始想用堆栈存每个叶子节点的深度与数值,结果算深度好悬没算死…)具体队列的操作可以看浙大课程2.3,至于基本的create和判空自己随便写写就好。BuildTree操作在小白专场里也讲的很明确,所以这个就算是对老师讲课内容的整理综合小应用程序吧(然而还是做了将近俩小时…)