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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

本文(综合性实验报告和完整代码.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

综合性实验报告和完整代码.docx

1、综合性实验报告和完整代码华南农业大学信息学院 综合性、设计性实验 起止日期:2011秋学院专业班级学号姓名实验题目实现平衡二叉排序树的各种算法自我评价项 目算法设计独立完成情况算法熟练程度测试通过成功失败独立帮助掌握了解不懂插入新结点AAAA前序、中序、后序遍历二叉树(递归)AAAA前序、中序、后序遍历的非递归算法AAAA层次遍历二叉树AAAA在二叉树中查找给定关键字AAAA交换各结点的左右子树AAAA求二叉树的深度AAAA叶子结点数AAAA删除某结点AAAA A-完成实验要求的全部功能并运行通过,算法有一定的新意,程序代码符合书写规范,实验报告叙述清晰完整,有详尽的分析和总结。 B-完成实验

2、要求的全部功能,程序代码符合书写规范,实验报告叙述 清晰完整。 C-完成实验要求的大部分功能,实验报告良好。 D-未按时完成实验,或者抄袭。成绩 教师签名:实现平衡二叉排序树的各种算法实验报告班级:姓名:学号:完成日期: 一、 分析题目要求用函数实现如下平衡二叉排序树算法,:(1) 插入新结点 (2) 前序、中序、后序遍历二叉树 (递归)(3) 前序、中序、后序遍历的非递归算法 (4) 层次遍历二叉树 (5) 在二叉树中查找给定关键字(函数返回值为成功1,失败0) (6) 交换各结点的左右子树 (7) 求二叉树的深度 (8) 叶子结点数(9) 删除某结点为了完成以上的各项操作,首先应该用函数建

3、一棵平衡二叉排序树,输入形式是首先输入要建的二叉树的结点数,然后依次输入各个结点的值。在实现插入新结点的函数时,需要一个向一棵二叉树插入新结点的函数。可用递归算法写出平衡二叉树的前序,中序,后序遍历的函数。在写平衡二叉树的前,中,后序遍历的非递归算法时要用到栈结构的知识,运用栈结构来存储平衡二叉树结点的指针。在层次遍历二叉树时需要用到队列结构,运用队列结构的先进先出来存储二叉树的结点指针。在遍历二叉树的结点时需要一个访问结点数据的函数。二叉树是一棵排序树,所以二叉树的查找可以运用其有序的性质,查找的方式和建树的方式相似。交换二叉树各结点的左右子树时,可以用先序遍历递归的方式从根结点向下递归,每

4、次访问结点时就需将各结点的左右孩子的指针调换,并对该结点的平衡因子作相应的处理。示二叉树的深度时,可用递归的方式访问结点的左右子树,并记录下左右子树的深度,最后返回左右子树中较深的深度的值即可。可以用一次遍历的方式遍历二叉树,记录每一个经过的结点,若结点存在且左右孩子都为空,则该结点为叶子结点。删除二叉树的某个结点时,首先要写一个函数,用递归查找的方式找到相应的结点,该函数还要有调整二叉树平衡的作用,因为若删除结点使得二叉树深度减少而不平衡,需要调整二叉树的平衡,若该结点不存在则返回ERROR,,若存在该结点,则应该再写一个函数来删除该结点,在删除之前还要判断该结点是只有左子树还是只有右子树还

5、是左右子树都有的情况:若只有左或是只有右子树,则只需删除该结点,并回溯调整二叉树的平衡;若该结点的左右子树都有,则应该用另一个函数递归找到该结点的直接“后继”,并从该“后继”开始回溯调整二叉树的平衡。下面是需要用到的函数列表:/队列结构 Status InitQueue(SqQueue &Q); /初始化队列 Status EnQueue(SqQueue &Q,QElemType e); /进队列 Status DeQueue(SqQueue &Q,QElemType &e); /出队列 Status GetHead(SqQueue Q,QElemType &e); /获队列首 int Que

6、ueLength(SqQueue Q); /队列长度 Status QueueTraverse(SqQueue Q); /遍历队列 /栈结构 Status InitStack(SqStack &S); /初始化栈 Status Push(SqStack &S,SElemType e); /进栈 Status Pop(SqStack &S,SElemType &e); /出栈 Status GetTop(SqStack S,SElemType &e); /获栈顶 int StackLength(SqStack S); /栈的长度 Status StackEmpty(SqStack S); /判栈

7、空 Status StackTraverse(SqStack S); /栈的遍历 /平衡二叉树 void R_Rotate(BSTree &p); /右旇 void L_Rotate(BSTree &p); /左旇 Status InsertAVL(BSTree &T,ElemType e,Boolean &taller);/平衡二叉树结点插入 void LeftBalance(BSTree &T); /左平衡 void RigthBalance(BSTree &T); /右平衡 Status CreateBST(BSTree &T,int n); /建树 Status Visit(ElemT

8、ype e); /访问 Status PreOrderTraverse(BSTree T); /前序遍历 Status InOrderTraverse(BSTree T); /中序遍历 Status PostOrderTraverse(BSTree T); /后序遍历 Status preOrderIter(BSTree T); /前序非递归遍历 Status inOrderIter(BSTree T); /中序非递归遍历 Status postOrderIter(BSTree T); /后序非递归遍历 Status FindBST(BSTree T,ElemType key,int &n);

9、/在二叉树中查找关键词 Status OverTraverse(BSTree &T); /层次遍历 Status OverChang(BSTree &T); /交换左右子树 int BSTDeep(BSTree T); /求树的深度 Status Sum(BSTree T,int &n); /求结点数 Status DeleteBST(BSTree &T,int key,bool &taller);/删除结点 Status Delete(BSTree &p,bool &taller); Status Delete2(BSTree &p,bool taller,ElemType &f); voi

10、d MU(); /选择菜单二、 解题思路对于要实现的各个操作求解过程:(1) 插入新结点 用递归查找二叉树的方式找到新结点插入的位置,若已经存在该结点则返回ERROR,若不存在,则插入新结点,并回溯调整二叉树的平衡。伪代码如下: Status InsertAVL(BSTree &T,ElemType e,Boolean &taller) If(!T) 插入新结点,树深度增加 Else if(edata) 查找左子树,如果子树增高,调整树平衡 Else if(eT-data) 查找右子树,如果子树增高,调整树平衡 Return OK;(2) 前序、中序、后序遍历二叉树 (递归) 用递归的方式遍历

11、每一个结点,如果左子树不为NULL,则遍历左子树,否则返回;如果右子树不为NULL,则遍历右子树,否则返回。伪代码如下: Status PreOrderTraverse(BSTree T) /前序遍历 if(T) /若结点不为空 if(Visit(T-data) /访问结点 if(PreOrderTraverse(T-lchild) /查找左子树 if(PreOrderTraverse(T-rchild) /查找右子树 return OK; return ERROR; else return OK;Status InOrderTraverse(BSTree T) /中序遍历if(T) /若结点

12、不为空 if(InOrderTraverse(T-lchild) /查找左子树 if(Visit(T-data) /访问结点 if(InOrderTraverse(T-rchild) /查找右子树 return OK; return ERROR; Else return OK;Status PostOrderTraverse(BSTree T) /后序遍历if(T) /若结点不为空 if(PostOrderTraverse(T-lchild) /查找左子树 if(PostOrderTraverse(T-rchild) /查找右子树 if(Visit(T-data) /访问结点 return O

13、K; return ERROR; else return OK;(3) 前序、中序、后序遍历的非递归算法 应该用栈先进后出的性质来保存结点的指针,出栈的过程就是回溯的过程。伪代码如下:Status preOrderIter(BSTree T) /前序非递归遍历 if (T = NULL) return ERROR; /若结点不为空 Push(S,p); /根结点进栈; while (!StackEmpty(S) /栈不空 GetTop(S,p); /获栈顶 Visit(p-data); /先序访问结点 Pop(S,p); /出栈 if (p-rchild != NULL) Push(S,p-rchild); /右子树进栈 if (p-lchild != NULL) Push(S,p-lchild); /左子树进栈 return OK; Status inOrderIter(BSTree T) /中序非递归遍历 if (T = NULL) return ERROR; /若结点不为空 while (p!= NULL | !StackEmpty(S) if (p!= NULL) Push(S,p); /所有左孩子进栈, p=p-lchild; else GetTop(S,p); /获最后一个左子树的结点 Visit(p-data); /访问结点 Pop(S,p); /最

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

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