二叉树的建立及相关算法的实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构实验
实验四
二叉树的建立及相关算法的实现
计算机科学与技术系0901班
组长:
组员:
日期:2011-05-05
2009级 0901班 2011年05月05日
实验类型:综合设计型 实验室:软件实验室三
组长: 组员:
1. 实验题目
二叉树的建立及相关算法的实现
2. 需求分析
本演示程序用VC++编写,实现了以下功能
① 建立一棵二叉树,然后对其进行先序、中序和后序遍历。 ② 显示二叉树
③ 求二叉树的高度及二叉树的叶子个数等等
④ 在主函数中设计一个简单的菜单,分别调试上述算法
3. 概要设计
为了实现上述程序功能,需要定义栈的抽象类型如下: ADT Stack{
数据对象:D={i a |i a ∈ElemSet,i=1,2,…,n, n ≧0}
数据对象:R1={<1,-i i a a >|1-i a ,D a i ∈,i=2,…,n}
约定n a 端为栈顶,i a 端为栈底。
基本操作:
InitStack(&S)
操作结果:构造一个空栈S 。 GetTop(S)
初始条件:栈S 已存在。
操作结果:用P 返回S 的栈顶元素。 Push(&S ,ch)
初始条件:栈S 已存在。
操作结果:插入元素ch 为新的栈顶元素。 Pop(&S)
初始条件:栈S 已存在。
操作结果:删除S 的栈顶元素。
}ADT Stack ADT Binary Tree{
数据对象 D :D 是具有相同特性的数据元素的集合。 基本操作 P :
InintBiTree(&T)
操作结果:构造空二叉树T 。 CreateBiTree(&T,definition);
初始条件:definition 给出二叉树T 的定义 操作结果:按definition 构造二叉树T.
Preordertraverse(T,Visit());
初始条件:二叉树T存在,Visit是对节点操作的应用函数。
操作结果:先序遍历T,对每个节点调用函数Visit一次且仅一次。一旦visit()失败,则操作失败。
Inordertraverse(T,Visit());
初始条件:二叉树T存在,Visit是对节点操作的应用函数。
操作结果:中序序遍历T,对每个节点调用函数Visit一次且仅一次。一旦visit()失败,则操作失败。
Postordertraverse(T,Visit())
初始条件:二叉树T存在,Visit是对节点操作的应用函数。
操作结果:后序遍历T,对每个节点调用函数Visit一次且仅一次。一旦visit()失败,则操作失败。
Levelordertraverse(T,Visit())
初始条件:二叉树T存在,Visit是对节点操作的应用函数。
操作结果:层序遍历T,对每个节点调用函数Visit一次且仅一次。一旦visit()失败,则操作失败。
}ADT BinaryTree
本程序还包含个函数:
(1)计算叶子总数函数:int Sumleaf(BiTree T)
(2)左右子数交换函数:void jiaohuan(BiTree T)
(3)节点数计算函数:int jiedianshu(BiTree T)
(4)深度计算函数:int Depth(BiTree T)
(5)显示二叉树函数:void xianshi(BiTree T)
函数调用图如下:
4.详细设计
#include
#include
#include
#define maxqsize 100
#define stackincrement 10
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
typedef struct{
BiTNode *base;
BiTNode *top;
int stacksize;
}sqstack;
void initstack (sqstack *s) //建栈
{s->base=(BiTNode *)malloc(maxqsize * sizeof(BiTNode));
if(!s->base) printf("存储空间失败!");
else
{s->top=s->base; s->stacksize=maxqsize;}}
void push(sqstack *s,BiTNode e) //压栈
{if(s->top-s->base==s->stacksize)
{s->base=(BiTNode *)realloc(s->base,(s->stacksize+stackincrement) * sizeof(BiTNode));
if(!s->base) printf("存储空间失败"); else
{s->top=s->base+s->stacksize;s->stacksize+=stackincre
*(s->top)=e; s->top++;}
BiTNode pop(sqstack *s) //弹出
{s->top--;return *s->top;}int sety(sqstack *s)
{if(s->top==s->base) return 1; else return 0;}
BiTree Create(BiTree T) //构造二叉链表
{ char ch; ch=getchar(); if(ch=='@') T=NULL; else
{ if(!(T=(BiTNode *)malloc(sizeof(BiTNode)))) printf("Error!");
T->data=ch; T->lchild=Create(T->lchild); T->rchild=Create(T->rchild); }