思路跟何老师讲的一样,无非就是把队列和二叉树的层序遍历组合起来。
#include<stdio.h>
#include<stdlib.h>
#define MAX 10
#define null -1
typedef struct QNode * Queue;
struct QNode{
int front,rear;
int *data;
int Maxsize;
};
typedef struct TreeNode * Tree;
struct TreeNode{
int left,right;
}T[MAX];
Queue Create(int Maxsize);
int BuildTree(struct TreeNode T[], int n);
void AddQ(Queue Q, int X);
int IsEmpty(Queue Q);
int Delete(Queue Q);
int main(void)
{
int N,R,K,num=0;
scanf("%d", &N);
R=BuildTree(T, N);
Queue Q = Create(N);
AddQ(Q,R);
while(IsEmpty(Q)==1){
K = Delete(Q);
if (T[K].left != -1 && T[K].right !=-1){
AddQ(Q,T[K].left);
AddQ(Q,T[K].right);
}
else if (T[K].left == -1 && T[K].right !=-1)
AddQ(Q,T[K].right);
else if (T[K].left != -1 && T[K].right ==-1)
AddQ(Q,T[K].left);
else{
num++;
if (num==1)
printf("%d",K);
else
printf(" %d",K);
}
}
return 0;
}
Queue Create(int Maxsize)
{
Queue Q = (Queue)malloc(sizeof(struct QNode));
Q->data=(int*)malloc(Maxsize*sizeof(int));
Q->Maxsize=MAX;
Q->front=Q->rear=0;
return Q;
}
int BuildTree(struct TreeNode T[], int n)
{
int Root=null,i,check[n];
char cl,cr;
if (n){
for (i=0; i<n; i++)
check[i] = 0;
for (i=0; i<n; i++){
getchar();
scanf("%c %c", &cl, &cr);
if (cl != '-'){
T[i].left = cl-'0';
check[T[i].left] = null;
}
else
T[i].left = null;
if (cr != '-'){
T[i].right = cr-'0';
check[T[i].right] = null;
}
else
T[i].right = null;
}
}
for (i=0; i<n; i++){
if (check[i]==0){
Root = i;
break;
}
}
return Root;
}
void AddQ(Queue Q, int X)
{
if ((Q->rear+1)%(Q->Maxsize) == Q->front)
return;
else{
Q->rear = (Q->rear+1)%(Q->Maxsize);
Q->data[Q->rear] = X;
}
}
int IsEmpty(Queue Q)
{
if (Q->front == Q->rear)
return 0;
else
return 1;
}
int Delete(Queue Q)
{
if (IsEmpty(Q)==0)
return -1;
else{
Q->front = (Q->front+1)%Q->Maxsize;
return Q->data[Q->front];
}
}