按给定的先序序列来建立二叉树

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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); //遍历右子树

相关文档
最新文档