一,源代码
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define OVERFLOW -1
#define ERROR 0
typedef int TElemType;
typedef int QElemType;
typedef int Status;
typedef struct BiTNode{
TElemType data;
struct BiTNode *lchild;
struct BiTNode *rchild;
}BiTNode,*BiTree;
typedef struct QNode{
struct BiTNode *BiTNode;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct {
QueuePtr front;
QueuePtr rear;
}LinkQueue;
//创建二叉树
Status CreateTree(BiTree *T)
{
char ch;
scanf("%c", &ch);
if (ch=='*')
{
*T = NULL;
}
else
{
*T = (BiTree)malloc(sizeof(BiTNode));
(*T)->data = ch;
CreateTree(&(*T)->lchild);
CreateTree(&(*T)->rchild);
}
//return OK;
}
//两数较大值
Status MaxOfTwo(int a, int b)
{
if (a >= b)
{
return a;
}
else
{
return b;
}
}
//获得二叉树的高度
int GetHeight(BiTree T)
{
if (T)
{
return MaxOfTwo(GetHeight(T->lchild), GetHeight(T->rchild)) + 1;
}
else
{
return 0;
}
}
//获得二叉树的叶子节点数
Status GetNodeNumber(BiTree T)
{
if (T==NULL)
return 0;
If(T->lchild==NULL&&T->rchild==NULL)
return 1;
return GetNodeNumber(T->lchild) + GetNodeNumber(T->rchild);
}
//前序遍历
Status PreOrderTraverse(BiTree T)
{
if (!T)
{
return 0;
}
printf("%c ", T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
//中序遍历
Status InOrderTraverse(BiTree T)
{
if (!T)
{
return 0;
}
InOrderTraverse(T->lchild);
printf("%c ", T->data);
InOrderTraverse(T->rchild);
}
//后序遍历
Status PostOrderTraverse(BiTree T)
{
if (!T)
{
return 0;
}
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%c ", T->data);
}
//初始化队列
Status InitQueue(LinkQueue &Q){
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
if(!Q.front) exit(OVERFLOW);
Q.front->next=NULL;
return OK;
}
//队列是否为空
Status QueueEmpty(LinkQueue Q){
if(Q.front==Q.rear)
return OK;
else
return ERROR;
}
//进队
Status EnQueue(LinkQueue &Q, BiTree p){
QueuePtr s;
s=(QueuePtr)malloc(sizeof(QNode));
if(!p) exit(OVERFLOW);
s->BiTNode=p; s->next=NULL;
Q.rear->next=s;
Q.rear=s;
return OK;
}
//出队
Status DeQueue(LinkQueue &Q,BiTree *p){
QueuePtr s;
if(Q.front==Q.rear) return ERROR;
s=Q.front->next;
*p=s->BiTNode;
Q.front->next=s->next;
if(Q.rear==s) Q.rear=Q.front;
free(s);
return OK;
}
//层序遍历
Status LevelOrderTraver(BiTree T)
{
LinkQueue Q;
BiTree p;
InitQueue(Q);
p=T;
EnQueue(Q,p);
while(!QueueEmpty(Q))
{
DeQueue(Q,&p);
printf("%3c",p->data);
if(p->lchild)
EnQueue(Q,p->lchild);
if(p->rchild)
EnQueue(Q,p->rchild);
}
}
//清除二叉树
Status ClearTree(BiTree *T)
{
if (!*T)
{
return 0;
}
ClearTree(&(*T)->lchild);
ClearTree(&(*T)->rchild);
free(*T);
*T = NULL;
}
//二叉树是否为空
bool IsTreeEmpty(BiTree T)
{
if (T)
{
return false;
}
else
{
return true;
}
}
int main(void)
{
int n;
BiTree t;
for(;;)
{
printf("**************菜单*****************\n");
printf("* 1.创建二叉树 *\n");
printf("* 2.二叉树的深度 *\n");
printf("* 3.二叉树节点数 *\n");
printf("* 4.前序遍历二叉树 *\n");
printf("* 5.中序遍历二叉树 *\n");
printf("* 6.后序遍历二叉树 *\n");
printf("* 7.层序遍历二叉树 *\n");
printf("* 8.清空二叉树 *\n");
printf("***********************************\n");
printf("请输入你的选择(1-8):\n");
scanf("%d",&n);
fflush(stdin);
switch(n)
{
case 1:
printf("输入二叉树的前序遍历序列,用*代替空节点:\n");
CreateTree(&t);
printf("二叉树构建成功\n");
break;
case 2:
printf("二叉树深度为:%d",GetHeight(t));
printf("\n");
break;
case 3:
printf("二叉树的节点数为:%d",GetNodeNumber(t));
printf("\n");
break;
case 4:
printf("前序遍历:");
PreOrderTraverse(t);
printf("\n");
break;
case 5:
printf("中序遍历:");
InOrderTraverse(t);
printf("\n");
break;
case 6:
printf("后序遍历:");
PostOrderTraverse(t);
printf("\n");
break;
case 7:
printf("层序遍历:");
LevelOrderTraver(t);
printf("\n");
break;
case 8:
ClearTree(&t);
if (IsTreeEmpty(t))
{
printf("\n\n二叉树已经删除。\n");
}
break;
}
}
}