数据结构二叉树的算法课程设计报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机工程学院

课程设计报告

课程名称:数据结构课程设计

设计题目:二叉树的算法

院系:计算机工程学院

专业:计算机科学与技术

组别:47

学生姓名: 姚燕学号:1101301231

起止日期:2011年12月19日~2011年12月26日指导教师:张亚红孙成富邱军林窦海洲

目录

1需求分析 (1)

1.1课程设计题目、任务及要求 (1)

1.2课程设计思想 (1)

1.3软硬件运行环境及开发工具 (1)

2概要设计 (2)

2.1各功能模块流程图 (2)

2.2 创建二叉树 (2)

2.3二叉树的递归遍历算法(先、中、后) (2)

2.3.1先序遍历 (2)

2.3.2中序遍历 (2)

2.3.3后序遍历 (2)

2.4二叉树的非递归遍历算法(前、中、后) (3)

2.4.1非递归的先序遍历算法 (3)

2.4.2非递归的中序遍历算法 (3)

2.4.3非递归的后序遍历算法 (3)

2.5层次序遍历 (3)

2.6退出 (3)

3详细设计和实现 (3)

3.1主要功能模块设计 (3)

3.2主程序设计 (4)

4调试与操作说明 (6)

4.1程序调试 (6)

4.2程序操作说明 (6)

总结 (9)

致谢 (10)

参考文献 (11)

1需求分析

1.1课程设计题目、任务及要求

二叉树的中序、前序、后序的递归、非递归遍历算法,层次序的非递归遍历算法的实现,应包含建树的实现。要求:遍历的内容应是多样的。

1.2课程设计思想

首先按先序次序建立一个二叉树,递归遍历,包括先序、中序、后序递归遍历。三种不同次序的遍历二叉树的递归算法的结构相似,只是访问结点及遍历左子树、遍历右子树的先后次序不同而已。在递归执行过程中,先序遍历是每进入一层递归调用时先访问根结点,再依次向它的左、右子树递归调用。中序遍历是在从左子树递归调用退出时访问根结点,然后向它的右子树递归调用。后序遍历是在从左、右子树递归调用后,再访问根结点。

把一个递归过程改为非递归过程一般需要利用栈,记录遍历时的回退路径。利用栈的先序遍历二叉树(非递归):每次访问一个结点后,在向左子树遍历下去之前,利用这个栈记录该结点的右子女(如果有的话)结点的地址,以便在左子树退回时可以直接从栈顶取得右子树的根结点,继续右子树的先序遍历。利用栈的中序遍历二叉树(非递归):首先访问的是中序下的一个结点,它位于从根开始沿左子树链走到最左下角的结点,该结点的左子树指针为空。访问它的数据之后,再遍历该结点的右子树。此右子树又是二叉树,重复执行上面的过程,直到该子树遍历完。结束条件为:栈为空的同时遍历指针也为空。利用栈的后序遍历二叉树(非递归):在遍历完左子树是还不能访问根结点,需要再遍历右子树。右子树遍历完后才访问根结点。所以在栈记录中必须注明刚才是在左子树还是右子树中。,在算法中首先使用栈暂存根结点地址,再向左子树遍历下去,此时根结点的tag=1。访问完左子树结点并退回时,还要遍历根的右子树,此时改根结点的tag=2.在从右子树中退出时才访问位于栈顶的根结点的值。

层次序遍历从二叉树的根结点开始,自上而下,自左向右分层依次访问树中的各个结点。访问二叉树的处理需要利用一个队列。在访问二叉树的某一层结点是,把下一层结点指针预先记忆在队列中,利用队列安排逐层访问的次序。每访问一个结点时,将它的子女依次加到队列的队尾,然后再访问已在队列队头的结

点。这样可以实现二叉树结点的按层访问。

1.3软硬件运行环境及开发工具

Windows2000以上操作系统、Microsoft Visual C++ 6.0

2概要设计

2.1各功能模块流程图

图2.1.2主函数流程图(b)

2.2 创建二叉树

(1)定义二叉树结点值的类型为字符型。(2)结点个数不超过20个。(3)按先序次序输入,构造二叉链表表示的二叉树T,空格表示空树。

2.3二叉树的递归遍历算法(先、中、后)

2.3.1先序遍历

(1)访问根结点。(2)先序遍历根结点的左子数。(3)先序遍历根结点的右子数。

2.3.2中序遍历

(1)先序遍历根结点的左子数。(2)访问根结点。(3)先序遍历根结点的右子数。

2.3.3后序遍历

(1)先序遍历根结点的左子数。(2)先序遍历根结点的右子数。(3)访问根结点。

2.4二叉树的非递归遍历算法(前、中、后)

2.4.1非递归的先序遍历算法

(1)访问结点的数据域。(2)指针指向p的左孩子结点。(3)从栈中弹出栈顶元素。(4)指针指向p的右孩子结点。

2.4.2非递归的中序遍历算法

(1)指针指向p的左孩子结点。(2)从栈中弹出栈顶元素。(3)访问结点的数据域。(4)指针指向p的右孩子结点。

2.4.3非递归的后序遍历算法

bt是要遍历树的根指针,后序遍历要求在遍历完左右子树后,再访问根。需要判断根结点的左右子树是否均遍历过。可采用标记法,结点入栈时,配一个标志一同入栈。

首先将bt和标记(为1)入栈,遍历左子树;返回后,修改栈顶标记为2,遍历右子树;最后访问根结点。

2.5层次序遍历

(1)访问该元素所指结点。(2)若该元素所指结点的左右孩子结点非空,则该元素所指结点的左孩子指针和右孩子指针顺序入队。

2.6退出

3详细设计和实现

3.1主要功能模块设计

程序主要设计了五个功能:首先是创建二叉树, 按先序次序输入,构造二叉链表表示的二叉树T,#表示空树。

其余还有四个模块,包括:二叉树的递归遍历算法(先序、中序、后序);层次序遍历;二叉树的非递归遍历算法(先序、中序、后序);退出。

主函数流程如下:

相关文档
最新文档