树和二叉树的应用
实验内容
基本要求:
算法:输入字符序列,建立二叉树;按先序、中序、后序遍历二叉树(三种递归算法和中序遍历的非递归算法);
拟遍历的二叉树(此处画出你计划遍历的二叉树和此二叉树对应的二叉链表存储结构)
实验源代码
#include <stdio.h>
#include <stdlib.h>
#define OK 0
#define OVERFLOW -2
#define ERROR 0
#define STACK_INIT_SIZE 100//存储空间初始分配量
#define STACKINCREMENT 10//存储空间分配增量
#define MAXSIZE 100
typedef char TElemType;
typedef int Status;
typedef struct BiTNode{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
typedef BiTree SElemType;
typedef struct{
SElemType *base;//在栈构造和销毁之后,base的值为NULL
SElemType *top;//栈顶指针
int stacksize;//当前已分配的存储空间
}Stack;
Status CreatBiTree(BiTree &T)
{
//按先序次序输入二叉树中结点的值,#字符表示空树
//构造二叉链表表示的二叉树T
char ch;
scanf("%c",&ch);
if(ch=='#') T=NULL;
else{
if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))
exit (OVERFLOW);
T->data =ch;//生成根节点
CreatBiTree(T->lchild );//构成左子树
CreatBiTree(T->rchild );//构成右子树
}
return OK;
}
/*先序遍历的递归算法*/
void PreOrderTraverse(BiTree T)
{
if(T){
printf("%c",T->data );
PreOrderTraverse(T->lchild );
PreOrderTraverse(T->rchild );
}
}
/*中序遍历的递归算法*/
void InOrderTraverse(BiTree T)
{
if(T){
InOrderTraverse(T->lchild );
printf("%c",T->data );
InOrderTraverse(T->rchild );
}
}
/*后序遍历的递归算法*/
void PostOrderTraverse(BiTree T)
{
if(T){
PostOrderTraverse(T->lchild );
PostOrderTraverse(T->rchild );
printf("%c",T->data );
}
}
Status InitStack(Stack &S){
//构造一个空栈
S.base=(SElemType*)malloc(STACK_INIT_SIZE
*sizeof(SElemType));
if(!S.base) exit(OVERFLOW);
S.top=S.base ;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
Status Push(Stack &S,SElemType e)
{
//入栈
if(S.top-S.base>=S.stacksize ){
//栈满
T.base=(SElemType*)realloc(S.base,
(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(S.base) exit(OVERFLOW);
S.top=S.base+S.stacksize ;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
}
Status Pop(Stack &S,SElemType &e){
//出栈
if(S.top==S.base ) return ERROR;
e=*--S.top ;
return OK;
}
Status StackEmpty(Stack S){
return (S.base=S.top )?true:false;
}
/*中序遍历非递归算法*/
Status Visit(SElemType e)
{
printf("%c",e);
return OK;
}
void Inorder(BiTree T,Status(*Visit)(SElemType e)){
Stack S;
BiTree p=T;
InitStack(S);
while(p||StackEmpty(S)){
if(p)
{
Push(S,p);
p=p->lchild ;
}
else{
Pop(S,p);
printf("%c",p->data);
p=p->rchild ;
}
}
}
main(){
BiTree T;
int p;
printf("按先序次序输入二叉树中结点的值,#字符表示空树:\n");
CreatBiTree(T);
printf("\n先序遍历输出:");
PreOrderTraverse(T);
printf("\n中序遍历输出:");
InOrderTraverse(T);
printf("\n后序遍历输出:");
PostOrderTraverse(T);
return OK;
}