树的应用-课程设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
中北大学
数据结构
课程设计说明书
学生姓名:赫景鑫学号:0921010451学院: 软件学院
专业: 软件工程
题目: 树的应用
成绩
指导教师尹四清、薛海丽
2011年1月6日
1.设计目的
《数据结构》课程主要介绍最常用的数据结构,阐明各种数据结构内在的逻辑关系,讨论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效率进行简单的分析和讨论。进行数据结构课程设计要达到以下目的:
⏹了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;
⏹初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;
⏹提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
2.设计内容和要求
设计内容:
(1)建立一棵树;
(2)将树转换成二叉树;
(3)实现二叉树的前序、中序、后序的递归和非递归遍历算法。
设计要求:
(1) 符合课题要求,实现相应功能;
(2) 要求界面友好美观,操作方便易行;
(3) 注意程序的实用性、安全性;
3.本设计所采用的数据结构
(1)typedef struct BTNode
定义一个用链式存储结构存储的二叉树,其中包括左孩子和右孩子以及数据元素的内容。和单链表类似,一个二叉链表由头指针唯一确定,若二叉树为空,则头指针指向空。并且结点内容的数据类型为字符型。
(2)CreateBiTree(BiTree &T)
此函数的功能是构建二叉树。从键盘上按先序次序输入字符构造二叉链表表示的二叉树T,其中用空格表示空树。
(3)PreOrderTraverse(BiTree T)
此函数功能是用递归的方法对二叉树进行先序遍历,调用此函数可以获得二叉树的递归的先序遍历的结果。
(4)InOrderTraverse(BiTree T)
此函数功能是用递归的方法对二叉树进行中序遍历,调用此函数可以获得二叉树的递归的中序遍历的结果。
(5)PostOrderTraverse(BiTree T)
此函数功能是用递归的方法对二叉树进行后序遍历,调用此函数可以获得二叉树的递归的后序遍历的结果。
(6)NRPreOrder(BiTree bt)
此函数的功能是用非递归的方法实现二叉树的先序遍历算法。调用此函数可以获得二叉树的非递归的先序遍历的结果。
(7)NRInOrder(BiTree bt)
此函数的功能是用非递归的方法实现二叉树的中序遍历算法。调用此函数可以获得二叉树的非递归的中序遍历的结果。
(8)NRPostOrder(BiTree bt)
此函数的功能是用非递归的方法实现二叉树的后序遍历算法。调用此函数可以获得二叉树的非递归的后序遍历的结果。
(9)typedef struct
{
BiTree ptr;
int tag;
}stacknode;
定义结构体,实现二叉树的非递归的后序遍历。
4.功能模块详细设计
4.1 详细设计思想
数据结构是计算机、信息管理、信息与计算机科学等信息类专业最重要的专业基础课程,掌握好数据结构的知识将直接关系到后续专业课程的学习。数据结构只要研究四个方面的问题:(1)数据的逻辑结构,即数据之间的逻辑关系;(2)数据的物理结构,即数据在计算机内的存储方式;(3)对数据的加工,即基于某种存储方式的操作算法;(4)算法的分析;即评价算法的优劣。
本实验是用链式存储结构来存储二叉树并进行一系列的算法,且结点内容的数据类型
为字符型。
本程序用VC++6.0编写,可以实现各种二叉树的遍历。包括先序遍历、中序遍历、后序遍历的递归算法,先序遍历、中序遍历、后序遍历的非递归算法。
二叉树的建立基本思想是:依次输入的结点信息,若输入的结点不是虚结点,则建立一个新结点。若新结点是第一个结点,则令其为根结点;否则将新结点作为孩子链接到它的双亲结点上。
程序主要是根据给定二叉树的先序遍历结果,构造出二叉树并输出按中,后序遍历的结果。其中二叉树的结点用字符表示。由于本人水平限制并没有实现树转化为二叉树的功能。
●先创建二叉树:按先序次序输入,构造二叉链表表示的二叉树。
●设计算法:先序遍历,中序遍历,后序遍历以及先序遍历、中序遍历、后序遍历的非递归
算法。
A.前序遍历二叉树
若二叉树非空,则依次进行如下操作:
a)访问根结点;
b)前序遍历左子数;
c)前序遍历右子树。
B.中序遍历二叉树
若二叉树非空,则依次进行如下操作:
a)中序遍历左子树;
b)访问根结点;
c)中序遍历右子树。
C.后序遍历二叉树
若二叉树非空,则依次进行如下操作:
a)后序遍历左子树;
b)后序遍历右子树;
c)访问根结点。
D. 先序遍历非递归算法
若二叉树非空,则依次进行如下操作:
a) 根节点入栈
b)
当堆栈非空时,循环执行一下步骤,出栈取得一个结点指针,访问该结点。若该结点的右子树非空,则将该结点的右子树指针入栈。若该结点的左子树非空,则将该结点的左子树指针入栈
c) 结束
E. 中序遍历非递归算法
若二叉树非空,则依次进行如下操作: a) 先将根结点入栈,然后将根结点的左子结点入栈,接着是已入栈的左子结点的左子结点入栈,以此类推,直到其左子结点为空 b)
将最后入栈的子结点出栈
c) 若其有右子结点则入栈,接着按1操作;否则将继续按2操作 F. 后序遍历非递归算法
若二叉树非空,则依次进行如下操作: 采用标记法,结点入栈时,配一个标志一同入栈 a) 遍历左子树的现场保护,
b) 遍历右子树前的现场保护。首先将遍历树的根指针入栈,遍历左子树;返回后,修
改栈,遍历右子树;最后访问根结点。 设计main()函数调用以上步骤实现相关功能。 功能流程图如下
4.2 核心代码 (1)定义二叉树
用链式存储结构存储二叉树。其中,Lchild 和Rchild 是分别指向该结点左孩子和右孩
先序遍历
后序遍历
非递归先序遍历非
递归后序遍
历非递归
中序遍历中序遍历
开 始 主 函 数
建立二叉