ImageVerifierCode 换一换
格式:DOCX , 页数:38 ,大小:118.90KB ,
资源ID:12101550      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/12101550.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构课程设计二叉树遍历C++语言.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构课程设计二叉树遍历C++语言.docx

1、数据结构课程设计二叉树遍历C+语言淮阴工学院实践报告数据结构课程设计设计题目: 二叉树遍历 系 别: 计算机工程学院 专 业: 软件工程 班 级: 软件1111 学生姓名: 周淼 学 号: 1111315217 起止日期: 2012年12月24日2012年12月30日指导教师: 寇海洲 摘要: 现代社会生活中,计算机扮演着重要角色,而随着计算机运行速度的不断加快,对数据的处理能力也日益增强,因此,程序所涉及的数据成爆发式增长。随之而来的问题就是如何科学有效的对数据进行操作,使得计算机的时间和空间利用率最高。针对这样的问题,我选择了二叉树对数据的各种操作作为我的课程设计主题,希望通过课程设计来提

2、高对数据的处理能力,促进对数据结构课程的理解,在日后面向对象的程序设计中科学的规划数据结构。在本次课程设计中,二叉树的建立使用了递归算法,遍历则同时使用了递归与非递归的算法,同时,在遍历算法的实现中使用了栈结构与队列结构,这大大方便了二叉树的遍历。在前序、中序、后续遍历算法中,分别实现了递归与非递归算法,从实际应用中体验了递归这一算法的优越性。关键词:二叉树建立,递归与非递归,遍历,栈,队列编号: 47 淮阴工学院 软件工程 专业数据结构课程设计答辩记录课题名称: 二叉树的算法 班 级 软件1111 学 号 1111315217 姓 名 周淼 答 辩 记 录问题1:课题中涉及到哪些数据结构和算

3、法?答: 1)数组,二叉树,栈,队列,线性表2)二叉树的中序、前序、后序的递归、非递归遍历算法,层次序遍历非递归算法,栈、队列的实现算法问题2:课题研究和设计中的关键技术是什么?答:关键技术是二叉树的建立,以及栈结构、队列的算法实现问题3:课题的主要功能和模块有哪些?答:1)主要功能:根据数据建立二叉树,实现二叉树的中序、前序、后序遍历2)模块:栈的应用,队列结构的应用,二叉树的操作问题4:课题在实现过程中遇到的主要难点有哪些?答:遍历二叉树过程中栈结构以及队列的使用问题5:课题中未能实现的功能有哪些?答:以树形结构输出完全二叉树 记录人:寇海洲 2012 年 12 月 28日1需求分析1.1

4、二叉树与树结构树结构的是建立在数据逻辑结构基础上的数据结构类型,二叉树则是树结构中最常见和使用最多的类型。通过对二叉树的操作,可以实现多种数据操作,如排序、查找等。一个好的二叉树遍历算法应包含以下功能: 1)以递归和非递归方法建立二叉树或完全二叉树; 2)实现二叉树的前序遍历、中序遍历、后序遍历; 3)每种遍历算法皆以递归和非递归方法实现; 4)在具体实现时应用其他数据结构类型对数据进行操作,如:栈,队列,数组。1.2面向对象的程序设计 在面向对象的程序设计中,模板的使用很普遍,因此,如何在程序设计中使用模板使得方法的实现与定义分开,程序模块化,既方便了程序设计者,又为程序的后期维护带来便利。

5、1.3二叉树遍历的应用当数据以数组或文档形式存储在内存时,其数据之间虽有逻辑联系,却过于分散,因此,建立二叉树以存储数据并且遍历该二叉树,可以从逻辑上理顺数据之间的关系,使得原本分数的数据排列的有序且可靠。一个好的二叉树应用算法其空间复杂度与时间复杂度必然最低,这样给程序带来时间和空间上的极大优化。1.4软件运行环境:Visual C+ 6.0版本2概要设计2.1 总体功能结构 二叉树的遍历,主要包含以下功能: 1)建立二叉树:递归方法、非递归方法 2)中序遍历:递归方法、非递归方法 3)前序遍历:递归方法、非递归方法 4)后序遍历:递归方法、非递归方法 5)栈结构使用:遍历时输入临时变量以保

6、存 6)队列结构使用:完全二叉树遍历时用以存储数据 2.2数据结构部分设计2.2.1结点结构 二叉树结点结构中包数据域(data),指针域(*leftChild,*rightChild)。结点结构的代码如下:struct BinTreeNode /树结点 T data; BinTreeNode *leftChild; BinTreeNode *rightChild; BinTreeNode():leftChild(NULL), rightChild(NULL) BinTreeNode(T x, BinTreeNode *l = NULL, BinTreeNode *r = NULL) :lef

7、tChild(l), rightChild(r) data = x; 栈结构结点包含数据域(data),指针域(*link),实现代码如下:struct StackNode /栈结点 T data; StackNode *link; StackNode(T d = 0, StackNode *next = NULL):link(next),data(d); 队列结构结点包含数据域(data),指针域(*link),实现代码如下:struct LinkNode T data; LinkNode *link; LinkNode(LinkNode *ptr=NULL) link = ptr; Lin

8、kNode(const T &item, LinkNode *ptr = NULL) data = item; link = ptr; ;2.2.2 二叉树结构 二叉树包含了递归、非递归建树过程,递归、非递归的前序遍历、中序遍历、后续遍历过程。二叉树的类定义包含各种操作,实现代码如下:template class BinaryTree /二叉树类定义public: BinaryTree():root(NULL) BinaryTree(T value):root(NULL) RefValue = value; BinaryTree(BinaryTree &s) if (this != &s) r

9、oot=Copy(s.root); BinaryTree() destroy(root); BinTreeNode *Parent(BinTreeNode *t) return (root = NULL | root = t)?NULL:Parent(root, t); BinTreeNode *LeftChild(BinTreeNode *t) return (t != NULL)?t-leftChild:NULL; BinTreeNode *RightChild(BinTreeNode *t) return (t != NULL)?t-rightChild:NULL; void PreOr

10、der(void (*visit)(BinTreeNode *t) PreOrder(root, visit); void InOrder(void (*visit)(BinTreeNode *t) InOrder (root, visit); void PostOrder(void (*visit)(BinTreeNode *t) PostOrder(root, visit); void CreateCompBinTree(T *CBT, int num)/建立完全二叉树 CreateCompBinTree(CBT, num, 0, root); void levelOrder(void (

11、*visit)(BinTreeNode *t); /层次序遍历 void PreOrder1(void (*visit) (BinTreeNode *t); /非递归前序遍历 void InOrder1(void (*visit) (BinTreeNode *t); /非递归中序遍历 void PostOrder1(void (*visit) (BinTreeNode *t); /非递归后序遍历 friend istream& operator (istream &in, BinaryTree &Tree)/输入二叉树 Tree.CreateBinTree(in, Tree.root); re

12、turn in; 栈结构的定义中,包含了对数据的入栈、出栈、清空等基本操作,实现代码如下template class LinkedStackprivate: StackNode *top;public: LinkedStack():top(NULL) /无头结点 LinkedStack() makeEmpty(); void Push(const T &x); bool Pop(T &x); bool IsEmpty()const return top=NULL; bool IsFull()const return false; void makeEmpty(); friend ostream

13、& operator (ostream &os, LinkedStack &s) osStack Size: s.getSize()endl; StackNode *p=s.top; int i=0; while (p) os+i: datalink; return os; ;template void LinkedStack:makeEmpty() StackNode *p; while (top) p=top; top=top-link; delete p; 队列的类定义,实现了对数据的入队、出队操作,实现代码如下:template class LinkedQueue /无头结点publi

14、c: LinkedQueue() rear = NULL; front = NULL; LinkedQueue() makeEmpty(); bool EnQueue(const T &x); bool DeQueue(T &x); void makeEmpty(); bool IsEmpty()const return front = NULL; friend ostream& operator (ostream &os, LinkedQueue &Q) LinkNode *p = Q.front; int i = 0; while (p) os # +i : data link; os Q

15、ueue Size: Q.getSize() endl; return os; void output();protected: LinkNode *front, *rear;3详细设计3.1建立二叉树 3.1.1功能描述 二叉树是程序的核心,如何合理的建立至关重要。本实例中使用递归和非递归方法分别建立二叉树,二叉树的数据来源于程序开始时建立的数组。建立后的二叉树保存,并且留作之后的遍历使用。3.1.2算法原理 本实例使用的是完全二叉树,首先建立头结点,并且保存数据,然后根据递归方法,分别建立其左右孩子结点,且左右孩子结点的指针域指向空。3.1.3 具体程序以递归方式建立二叉树,每次建立一个结

16、点后,将其左右孩子指针域置空,成为叶子结点。具体实现代码如下:template void BinaryTree:CreateBinTree(istream &in, BinTreeNode *& subTree) T item; if (in item) if (item != RefValue) subTree = new BinTreeNode(item); /Create Root assert(subTree); CreateBinTree(in, subTree-leftChild); / Create left child tree CreateBinTree(in, subTre

17、e-rightChild); / Create reght child tree else subTree = NULL; /建立完全二叉树templatevoid BinaryTree:CreateCompBinTree(T *CBT, int num, int rt, BinTreeNode *& subTree) if (rt = num) subTree = NULL; else subTree = new BinTreeNode(CBTrt); CreateCompBinTree(CBT, num, 2*rt+1, subTree-leftChild); CreateCompBinT

18、ree(CBT, num, 2*rt+2, subTree-rightChild); 3.2 前序遍历3.2.1 功能原理 通过前序遍历,将二叉树中的数据按照前序遍历的结果输出,达到前序便利的目的,方便数据的使用。3.2.2 算法原理前序遍历使用了递归与非递归两种方法,在程序头文件中定义了两个函数分别实现其功能。递归时,输出第一个结点数据时,找到数据,然后找到其后面的数据,然后依次递归输出。非递归时,使用栈和队列结构,将部分数据保存在栈或队列中,等待将数据放到合适位置。3.2.3 具体程序1)递归算法实现:template void BinaryTree:PreOrder(BinTreeNod

19、e* subTree, void (*visit)(BinTreeNode *t) if (subTree != NULL) visit(subTree); PreOrder(subTree-leftChild, visit); PreOrder(subTree-rightChild, visit); 2)非递归算法实现:template void BinaryTree:PreOrder1(void (*visit) (BinTreeNode *t) ) LinkedStackBinTreeNode* S; BinTreeNode *p = root; S.Push (NULL); while

20、 (p!=NULL) visit(p); /访问结点 if (p-rightChild != NULL) S.Push (p-rightChild); /预留右指针在栈中 if (p-leftChild != NULL) p=p-leftChild; /进左子树 else S.Pop(p); /左子树为空,由堆栈弹出 3.3 中序遍历3.3.1 功能原理 通过中序遍历,将二叉树中的数据按照中序序遍历的结果输出,达到中序遍历的目的,实现数据的最优,方便数据的使用。3.3.2 算法原理中序遍历使用了递归与非递归两种方法,在程序头文件中定义了两个函数分别实现其功能。递归时,输出第一个结点数据时,找到

21、数据,然后依次找到其后面的数据,然后依次递归输出。非递归时,使用栈和队列结构,将部分数据保存在栈与队列中,等待将数据放到合适位置。3.3.3 具体程序1)递归算法实现:template void BinaryTree:InOrder(BinTreeNode *subTree, void (*visit)(BinTreeNode *t) if (subTree != NULL) InOrder(subTree-leftChild, visit); visit(subTree); InOrder(subTree-rightChild, visit); 2)非递归算法实现:template void

22、 BinaryTree:InOrder1(void (*visit) (BinTreeNode *t) /非递归中序遍历 LinkedStackBinTreeNode* S; BinTreeNode *p = root; while(p!=NULL | !S.IsEmpty () while (p!= NULL) /遍历指针向左下移动 S.Push (p); /该子树沿途结点进栈 p=p-leftChild; if (!S.IsEmpty() /栈不空时退栈 S.Pop(p); visit (p); /退栈, 访问 p=p-rightChild; /遍历指针进到右子女 3.4 后序遍历3.4.

23、1功能原理 通过后序遍历,将二叉树中的数据按照后序遍历的结果输出,达到后序遍历的目的,实现数据的最优,方便数据的使用。3.4.2 算法原理后序遍历使用了递归与非递归两种方法,在程序头文件中定义了两个函数分别实现其功能。递归时,输出第一个结点数据时,找到数据,然后依次找到其后面的数据,然后依次递归输出。非递归时,使用栈和队列结构,将部分数据保存在栈与队列中,等待将数据放到合适位置。3.4.3 具体程序1)递归算法实现:template void BinaryTree:PostOrder(BinTreeNode *subTree, void (*visit)(BinTreeNode *t) if

24、(subTree != NULL ) PostOrder(subTree-leftChild, visit); PostOrder(subTree-rightChild, visit); visit (subTree); 2)非递归算法实现:template void BinaryTree:PostOrder1(void (*visit) (BinTreeNode *t) /非递归后序遍历 LinkedStackstkNode S; stkNode w; BinTreeNode *p=root; /p是遍历指针 do while (p != NULL) w.ptr = p; w.tag = s

25、tkNode:L; /枚举类型定义在struct stkNode中,如定义为全局性就简单了 S.Push (w); p = p-leftChild; int continue1 = 1; while (continue1 & !S.IsEmpty () S.Pop (w); p = w.ptr; switch (w.tag) /判断栈顶的tag标记 case stkNode:L: w.tag = stkNode:R; S.Push (w); continue1 = 0; p = p-rightChild; break; case stkNode:R: visit (p); break; whi

26、le (!S.IsEmpty(); /继续遍历其他结点 cout endl;3.5层次序非递归遍历3.5.1 功能原理 层次序非递归遍历,依据的是递归原理,每次遍历一个结点后,同时让其左右孩子入队,以便达到层次序的目的。3.5.2 算法原理每次遍历完一个结点后,检查该结点是否为叶子结点,如果是叶子结点则继续下一结点的遍历,否则其左右孩子入队,继续遍历。3.5.3 具体程序template void BinaryTree:levelOrder (void (*visit) (BinTreeNode *t) /层次序遍历 if (root = NULL) return; LinkedQueueBi

27、nTreeNode * Q; BinTreeNode *p=root; visit(p); Q.EnQueue(p); while (!Q.IsEmpty () Q.DeQueue (p); if (p-leftChild != NULL) visit (p-leftChild); Q.EnQueue (p-leftChild); if (p-rightChild != NULL) visit (p-rightChild); Q.EnQueue(p-rightChild); 3.6 栈结构3.6.1 功能原理 运用栈结构,在非递归算法中,未输出的数据暂时存入栈中,依据先进后出原则,方便了二叉树的遍历。3.6.2算法原理二叉树的结点信息,保存在栈中。第一个入栈的数据元素保存在栈底,后进栈的在上方,现出栈。3.6.3 具体程序template void LinkedStack:Push(const T &x) top = new StackNode

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1