C/C++代码实现
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define QUEUE_INIT_SIZE 100
#include <stdio.h>
#include <stdlib.h>
typedef int Status;
typedef char TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode* lchild;
struct BiTNode* rchild;
} BiTNode, * BiTree;
typedef BiTree QElemType;
typedef struct
{
QElemType* base;
int front;
int rear;
} SqQueue;
Status InitQueue(SqQueue& Q)
{
Q.base = (QElemType*)malloc(sizeof(QElemType) * QUEUE_INIT_SIZE);
if (!Q.base) exit(OVERFLOW);
Q.front = Q.rear = 0;
return OK;
}
Status EnQueue(SqQueue& Q, QElemType e)
{
Q.base[Q.rear] = e;
Q.rear = Q.rear + 1;
return OK;
}
Status DeQueue(SqQueue& Q, QElemType& e)
{
if (Q.front == Q.rear)
{
return ERROR;
}
e = Q.base[Q.front];
Q.front = Q.front + 1;
return OK;
}
Status IsEmpty(SqQueue& Q)
{
if (Q.front == Q.rear) return TRUE;
return FALSE;
}
Status GetFront(SqQueue& Q, QElemType& e)
{
if (Q.front == Q.rear)
return ERROR;
e = Q.base[Q.front];
return OK;
}
void ClearQueue(SqQueue& Q)
{
free(Q.base);
Q.base = NULL;
Q.front = Q.rear;
}
Status CreateBiTree(BiTree& T)
{
TElemType ch;
scanf("%c", &ch);
if (ch == '#')
{
T = NULL;
}
else
{
if ((T = (BiTNode*)malloc(sizeof(BiTNode))) == NULL)
exit(OVERFLOW);
T->data = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return OK;
}
Status PreOrderTraverse(BiTree& T)
{
if (T)
{
printf("%c ", T->data);
if (PreOrderTraverse(T->lchild))
if (PreOrderTraverse(T->rchild))
return OK;
}
else
{
return OK;
}
}
Status InOrderTraverse(BiTree& T)
{
if (T)
{
if (InOrderTraverse(T->lchild))
{
printf("%c ", T->data);
if (InOrderTraverse(T->rchild))
return OK;
}
}
else
{
return OK;
}
}
Status PostOrderTraverse(BiTree& T)
{
if (T)
{
if (PostOrderTraverse(T->lchild))
if (PostOrderTraverse(T->rchild))
{
printf("%c ", T->data);
return OK;
}
}
else
{
return OK;
}
}
void LevelOrderTraverse(BiTree& T)
{
BiTree t;
SqQueue Q;
InitQueue(Q);
if (T)
{
EnQueue(Q, T);
while (!IsEmpty(Q))
{
GetFront(Q, t);
printf("%c ", t->data);
DeQueue(Q, t);
if (t->lchild)
{
EnQueue(Q, t->lchild);
}
if (t->rchild)
{
EnQueue(Q, t->rchild);
}
}
}
ClearQueue(Q);
}
void ShapeBiTree(BiTree &T,int depth)
{
if (T)
{
ShapeBiTree(T->rchild, depth + 1);
for (int i = 1; i < depth; i++)
printf(" ");
printf("%c\n", T->data);
ShapeBiTree(T->lchild, depth + 1);
}
}
void DestroyBiTree(BiTree &T)
{
if (T)
{
if (T->lchild)
DestroyBiTree(T->lchild);
if (T->rchild)
DestroyBiTree(T->rchild);
free(T);
T = NULL;
}
}
int main()
{
BiTree T;
CreateBiTree(T);
printf("先序:");
PreOrderTraverse(T);
printf("\n");
printf("中序:");
InOrderTraverse(T);
printf("\n");
printf("后序:");
PostOrderTraverse(T);
printf("\n");
printf("层次:");
LevelOrderTraverse(T);
printf("\n");
ShapeBiTree(T, 1);
DestroyBiTree(T);
return 0;
}