树和二叉树的应用

树和二叉树的应用
实验内容
基本要求:
算法:输入字符序列,建立二叉树;按先序、中序、后序遍历二叉树(三种递归算法和中序遍历的非递归算法);
拟遍历的二叉树(此处画出你计划遍历的二叉树和此二叉树对应的二叉链表存储结构)
在这里插入图片描述

实验源代码
#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;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cai-4

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值