二叉树遍历算法的实现

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

关系H1⊂H;若Dτ≠Φ,则D r中存在唯一的元素x r,

H,且存在D r上的关系H r⊂H;H={,,H1,H r};

(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(){

相关文档
最新文档