二叉树遍历算法的实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
二叉树遍历算法的实现
题目:编制二叉树遍历算法的实现的程序
一.需求分析
1.本演示程序中,二叉树的数据元素定义为非负的整型(unsigned int)数据,输
入-1表示该处没有节点
2.本演示程序输入二叉树数据均是按先序顺序依次输入
3.演示程序以用户和计算机对话方式执行,即在计算机终端上显示“提示信息”
之后,由用户在键盘上输入演示程序中规定的运算命令;相应的输入数据和运
算结果显示在其后
4.本实验一共包括三个主要程序,分别是:1)二叉树前序,中序,后序遍历递归
算法实现2)二叉树前序中序遍历非递归算法实现3)二叉树层次遍历算法实现
5.本程序执行命令包括:1)构建二叉树2)二叉树前序递归遍历3)二叉树中序
递归遍历4)二叉树后序递归遍历5)二叉树前序非递归遍历6)二叉树中序非
递归遍历7)二叉树层次遍历
6.测试数据
(1)7 8 -1 9 10 -1 -1 -1 6 11 -1 -1 12 13 -1 -1 14 -1 -1
(2)1 -1 -1
(3)7 8 -1 -1 9 -1 -1
二.概要设计
1.为实现二叉树的遍历算法,我们首先给出如下抽象数据类型
1)二叉树的抽象数据类型
ADT BiTree{
数据对象D:D是具有相同特性的数据元素的集合
数据关系R:
若D=Φ,则R=Φ,称BiTree是空二叉树;
若D≠Φ,则R={H},H是如下二元关系:
(1)在D中存在唯一的成为根的数据元素root,它在关系H下无前驱;
(2)若D-{H}≠Φ,则存在D-{root}={D1,D r},且D1∩D r=Φ
(3)若D1≠Φ,则D1中存在唯一的元素x1,
关系H1⊂H;若Dτ≠Φ,则D r中存在唯一的元素x r,
H,且存在D r上的关系H r⊂H;H={
(4)(D1,{H1})是符合本定义的二叉树,成为根的左子树,(D r,{H r})是
一颗符合本定义的二叉树,成为根的右字树。
基本操作P:
InitBiTree(&T);
操作结果:构造空二叉树
DestroyBiTree(&T)
初始条件;二叉树存在
操作结果:销毁二叉树
CreateBiTree(&T,definition);
初始条件:按definition给出二叉树T的定义
操作结果:按definition构造二叉树
BiTreeEmpty(T)
初始条件:二叉树T存在。
操作结果:若二叉树为空树,返回TRUE,否则返回FALSE
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 BiTree
2)栈的抽象数据类型
ADT Stack{
数据对象D:D={a i|a i∈ElemSet,i=1,2,…,n,n≥0}
数据关系R:R={|a i-1,a i∈D,i=2,…,n}
约定a n端为栈顶,a1端为栈底。
基本操作P:
InitStack(&S)
操作结果:构造一个空栈
StackEmpty(S)
初始条件:栈S已存在
操作结果;若栈S为空,则返回TRUE,否则返回FALSE
GetTop(S,&e)
初始条件:栈S已存在且非空
操作结果:用e返回S的栈顶元素
Push(&S,e)
初始条件:栈S已存在
操作结果:插入元素e作为新的栈顶元素
Pop(&S,&e)
初始条件:栈S已存在且非空
操作结果:删除栈S 的栈顶元素,且用e返回其值
}//ADT Stack
3)队列的抽象数据类型
ADT Queue{
数据对象D:D={a i|a i∈ElemSet,i=1,2,…,n,n≥0}
数据关系R:R={|a i-1,a i∈D,i=2,…,n}
约定a n端为队列尾,a1端为队列头。
基本操作P:
InitQueue(&Q)
操作结果:构造一个空队列Q
QueueEmpty(Q)
初始条件:队列Q已存在
操作结果:若Q为空队列,则返回TRUE,否则FALSE
GetHead(Q,&e)
初始条件:Q为非空队列
操作结果:用e返回Q的队头元素
EnQueue(&Q,e)
初始条件:队列Q已存在
操作结果:插入元素e为Q的新的队尾元素
DeQueue(&Q,&e)
初始条件:Q为非空队列
操作结果:删除Q的队头元素,并用e返回其值
}//ADT Queue
2.本实验包括三个程序,每个程序包括的模块有
1)二叉树遍历的前序中序后序递归算法
a.主程序模块:
void main(){
初始化;
do{
接受命令;
处理命令;
}while(“命令”=“退出”);
}
b.二叉树模块——实现二叉树的抽象数据类型
c.各模块间调用关系为
主程序模块
二叉树模块
2)二叉树的前序中序遍历非递归算法
a.主程序模块
void main(){