#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef int Status;
#define OK 1
#define ERROR 0
//二叉树的二叉链表存储表示
typedef struct BiTNode //参考书Pg. 127
{
char data;//结点元素
struct BiTNode * lchild,*rchild;//左右孩子节点
}BiTNode,*BiTree;
char d[30]={'-','+','a',' ',' ','*','b',' ',' ','-','c',' ',' ','d',' ',' ','/','e',' ',' ','f',' ',' '};//先序序列
char e[30]={' ','a',' ','+',' ','b',' ','*',' ','c',' ','-',' ','d',' ','-',' ','e',' ','/',' ','f',' '};//中序序列
int i=0;
char ch;
Status CreateInBiTree(BiTree &T)//初始化利用先序输入实现
{//请补充你的代码:按先序输入二叉树中结点的值(一个字符),空格字符表示空树,可以参考 书Pg. 131 按先序输入二叉树 算法6.4
ch=d[i];
i++;
if(ch==' ')
T=NULL;
else
{
T=new BiTNode;
T->data =ch;
CreateInBiTree(T->lchild );
CreateInBiTree(T->rchild );
}
return OK;
}
Status PreOrderTraverse(BiTree T)
{//请补充你的代码:先序遍历二叉树T,输出T的先序序列,可以参考 书Pg. 129 算法6.1
if(T)
{
printf("%c",T->data );
PreOrderTraverse(T->lchild );
PreOrderTraverse(T->rchild );
}
return OK;
}
Status InOrderTraverse(BiTree T)
{//请补充你的代码:中序遍历二叉树T,输出T的中序序列,可以参考 书Pg. 129 算法6.1
if(T)
{
InOrderTraverse(T->lchild );
printf("%c",T->data );
InOrderTraverse(T->rchild );
}
return OK;
}
Status PostOrderTraverse(BiTree T)
{//请补充你的代码:后序遍历二叉树T,输出T的后序序列,可以参考 书Pg. 129 算法6.1
if(T)
{
PostOrderTraverse(T->lchild );
PostOrderTraverse(T->rchild );
printf("%c",T->data );
}
return OK;
}
Status DestroyBiTree(BiTree &T)
{//请补充你的代码:销毁二叉树T
if(T)
{
DestroyBiTree(T->lchild );
DestroyBiTree(T->rchild );
delete(T);
T->lchild =NULL;
T->rchild =NULL;
}
return OK;
}
//以下可以根据需要定义自己的函数
//主函数
int main(int argc,char* argv[])
{
//输出你的姓名和学号
printf("\n%s, %s\n",name,id);
BiTree T;
//请补充你的代码:初始化T, 建立一个如参考书Pg.129 图6.9的二叉树,其中序序列为:a+b*(c-d)-e/f
CreateInBiTree(T);
//请补充你的代码:请按先序遍历T,并且在屏幕上输出T的先序序列:- + a * b - c d / e f
PreOrderTraverse(T);
printf("\n");
//请补充你的代码:请按中序遍历T,并且在屏幕上输出T的中序序列:a + b * c - d - e / f
InOrderTraverse(T);
printf("\n");
//请补充你的代码:请按后序遍历T,并且在屏幕上输出T的后序序列:a b c d - * + e f / -
PostOrderTraverse(T);
//请补充你的代码:释放T
DestroyBiTree(T);
return 1;
}