北理工自动化数据结构实验报告3
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构与算法统计》
实验报告
——实验三
一、实验目的
1. 熟悉VC环境,掌握对二叉树的基本操作。
2. 在上机、调试的过程中,加强对二叉树的理解和运用。
3. 复习线性链表和递归
4. 锻炼动手编程和独立思考的能力。
二、实验内容
遍历二叉树。
请输入一棵二叉树的扩展的前序序列,经过处理后生成一棵二叉树,然后对于该二叉树输出前序、中序和后序遍历序列。
三、程序设计
1、概要设计
本程序包含三个模块:
1.构造二叉树模块
2.遍历二叉树模块
3.主程序模块
采用二叉链表作为存储结构。
(1)二叉树的抽象数据类型定义为:
ADT BinaryTree {
数据对象D:
D是具有相同特性的数据元素的集合。
数据关系R:
若D=Φ,则R=Φ,称BinaryTree为空二叉树;
若D≠Φ,则R={H},H是如下二元关系;
(1)在D中存在惟一的称为根的数据元素root,它在关系H下无前驱;
(2)若D-{root}≠Φ,则存在D-{root}={D1,Dr},且D1∩Dr =Φ;
(3)若D1≠Φ,则D1中存在惟一的元素x1,
关系H1 ⊆H;若Dr≠Φ,则Dr中存在惟一的元素xr,
在上的关系Hr ⊆H;H={
(4)(D1,{H1})是一棵符合本定义的二叉树,称为根的左子树;(Dr,{Hr})是
一棵符合本定义的二叉树,称为根的右子树。
基本操作:
CreatBiTree(BiTree &T)
操作结果:按先序次序建立二叉链表表示的二叉树T
PreOrderTraverse(BiTree T,int (*visit)(char e))
初始条件:二叉树T已经存在,visit是对结点操作的应用函数
操作结果:先序遍历二叉树T ,对每个结点调用visit函数仅一次;一旦
visit()失败,则操作失败。
InOrderTraverse(BiTree T,int (*visit)(char e))
初始条件:二叉树T已经存在,visit是对结点操作的应用函数
操作结果:中序遍历二叉树T ,对每个结点调用visit函数仅一次;一旦
visit()失败,则操作失败。
PostOrderTraverse(BiTree T,int (*visit)(char e))
初始条件:二叉树T已经存在,visit是对结点操作的应用函数
操作结果:后序遍历二叉树T ,对每个结点调用visit函数仅一次;一旦
visit()失败,则操作失败。
} ADT BinaryTre e
(2)主程序流程
主程序先调用CreatBiTree(BiTree &T)函数,根据输入的先序序列构造出一棵二叉树,再依次调用PreOrderTraverse(BiTree T,int (*visit)(char e)),InOrderTraverse(BiTree T,int (*visit)(char e)),PostOrderTraverse(BiTree T,int (*visit)(char e))函数,对该二叉树进行先序、中序、后序遍历并输出结果。
(3)模块调用关系
由主函数调用创建模块,再调用计算模块,由计算模块将结果输出。
(4)流程图
开始
创建二叉树
输入先序序列
先序遍历二叉树
分别调用函数
中序遍历二叉树
输出结果
后序遍历二叉树
结束
2、详细设计
⑴数据类型设计
typedef struct BiTNode//二叉树结构类型
{
char data;//建立数据域
struct BiTNode *lchild,*rchild;//建立左指针和右指针
}BiTNode,*BiTree;
⑵操作算法设计
int CreatBiTree(BiTree &T)
//按先序次序建立二叉链表表示的二叉树T
char ch;
scanf("%c",&ch);
if(ch==' ')
{
T=NULL;
}
else
{
T=(BiTNode *)malloc(sizeof(BiTNode));
if(!T)
{
exit (OVERFLOW);
}
T->data=ch;
CreatBiTree(T->lchild);
CreatBiTree(T->rchild);
}
return 1;
}
int visit(char e)
//对数据进行输出
{
printf("%c",e);
return 1;
}
int PreOrderTraverse(BiTree T,int (*visit)(char e))
//先序遍历二叉树T的递归算法
{
if(T)
{
if(visit(T->data))
if(PreOrderTraverse(T->lchild,visit))
if(PreOrderTraverse(T->rchild,visit)) return 1;
return 0;
}
else
return 1;
}
int InOrderTraverse(BiTree T,int (*visit)(char e))
//中序遍历二叉树T的递归算法