按给定的先序序列来建立二叉树
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程题目:按给定的先序序列来建立二叉树
班级:10计算机2班姓名:熊芸芸学号:10070518
完成日期:12月2日星期五
一、需求分析
1、题目要求
1.1 存储结构: 以二叉链表作为二叉树的存储结构
1.2 二叉树的创建:以给定的先序序列来创建二叉树
1.3 输出二叉树: 以中序和后序序列输出二叉树的结点
2、测试数据:
A B $ D G $ $ $ C E $ H $ $ F $ $($表示空格符号)
二、概要设计
ADT BinaryTree {
数据对象D: D是具有相同特性的数据元素的集合。数据关系: R1={ |a i-1,a i ∈D, i=2,...,n }
数据关系 R:若D为空集,则称为空树;
否则:(1) 在D中存在唯一的称为根的数据元素root,
(2) 当n>1时,其余结点可分为m (m>0)个互不相交的有限集T1, T2, …, Tm, 其中每一个子集本身又是一棵树,称为根root的子树。
基本操作:
InitStack(SqStack &s) //初始化栈
StackElemty(SqStack &s) //判断栈是否为空
Push(SqStack &s,BiTree e) //将元素e进栈
Pop(SqStack &s,BiTree &e) //出栈,栈顶元素返回给e
CreateBiTree(BiTree &t) //用先序建立一个二叉树,空格表示空树
InOrderTraverse(BiTree t,Status(* Visit)(TElemType e))//用非递归方式实现中序遍历,对每个元素调用函数visit
PostorderTraverse(BiTree t) //用递归方式实现后序遍历
} ADT BinaryTree
三、详细设计
#include
#include
typedef int Status;
typedef char TElemType;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define STACK_INIT_SIZE 50
#define STACKINCREMENT 10
typedef struct BiTNode
{//树二叉链表的存储结构
TElemType data;
struct BiTNode *lchlid,*rchlid;
}BiTNode,*BiTree;
typedef struct
{//栈的存储结构
BiTree *base;
BiTree *top;
int stacksize;
}SqStack;
Status InitStack(SqStack &s)
{//初始化栈
s.base=(BiTree *)malloc(STACK_INIT_SIZE * sizeof(BiTree));
if(!s.base) exit(OVERFLOW);
s.top=s.base;
s.stacksize=STACK_INIT_SIZE;
return OK;
}
Status StackElemty(SqStack &s)
{//判断栈是否为空
if(s.base!=s.top)
return ERROR;
return OK;
}
Status Push(SqStack &s,BiTree e)
{//将元素e进栈
if(s.top-s.base>=s.stacksize)
{ //追加分配
s.base=(BiTree
*)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(BiTree)); if(!s.base) exit(OVERFLOW);
s.top=s.base+s.stacksize;
s.stacksize+=STACKINCREMENT;
}
*s.top++=e;
return OK;
}
Status Pop(SqStack &s,BiTree &e)
{//出栈,栈顶元素返回给e
if(s.top==s.base) return ERROR;
e=*--s.top;
return OK;
}
Status CreateBiTree(BiTree &t)
{//用先序建立一个二叉树,空格表示空树
TElemType ch;
scanf("%c",&ch);
if(ch==' ') t=NULL;
else
{
if(!(t=(BiTNode *)malloc(sizeof(BiTNode))))
exit(OVERFLOW);
t->data=ch; //生成根结点
CreateBiTree(t->lchlid); //构造左子树
CreateBiTree(t->rchlid); //构造右子树
}
return OK;
}
Status Visit(TElemType e)
{//访问函数
printf("%c",e);
return OK;
}
Status InOrderTraverse(BiTree t,Status(* Visit)(TElemType e)) {//用非递归方式实现中序遍历,对每个元素调用函数visit SqStack s;
InitStack(s); //建立一个栈存储二叉树的结点
BiTree p=t;
while(p||!StackElemty(s))
{
if(p)
{//根指针进栈,遍历左子树
Push(s,p);
p=p->lchlid;
}
else
{//根指针退栈,访问根结点,遍历右子树
Pop(s,p);
if(!Visit(p->data)) return ERROR;
p=p->rchlid;
}
}
printf("\n");
return OK;
}
Status PostorderTraverse(BiTree t)
{//用递归方式实现后序遍历
if(t)
{
PostorderTraverse(t->lchlid); //遍历左子树
PostorderTraverse(t->rchlid); //遍历右子树