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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

二叉树的简单操作.docx

1、二叉树的简单操作实验3 二叉树的遍历成绩专业班级 信息131班 学号 201312030120 姓名 * 报告日期 2015.11.25实验类型:验证性实验 综合性实验 设计性实验实验目的或任务通过指导学生上机实践,对常用数据结构的基本概念及其不同的实现方法的理论得到进一步的掌握,并对在不同存储结构上实现不同的运算方式和技巧有所体会。实验教学基本要求1.了解实验目的及实验原理;2.编写程序,并附上程序代码和结果图;3.总结在编程过程中遇到的问题、解决办法和收获。实验教学的内容或要求1.编写函数,输入字符序列,建立二叉树的二叉链表2.编写函数,实现二叉树的中序递归遍历算法。3.编写函数,实现二叉

2、树的中序非递归遍历算法4.编写函数,借助队列实现二叉树的层次遍历算法5.编写函数,求二叉树的高度6.编写函数,求二叉树的结点个数7.编写函数,求二叉树的叶子个数8.编写函数,交换二叉树每个结点的左子树和右子树9.编写一个主函数,在主函数中设计一个简单的菜单,分别调试上述算法 实验开出要求必做实验所需仪器设备1.计算机2.相关软件(如C,C+,PASCAL,VC,DELPHI等等)实验所用材料计算机耗材一、实验效果图1.编写函数,输入字符序列,建立二叉树的二叉链表2.编写函数,实现二叉树的中序递归遍历算法。3.编写函数,实现二叉树的中序非递归遍历算法4.编写函数,借助队列实现二叉树的层次遍历算法

3、5.编写函数,求二叉树的高度6.编写函数,求二叉树的结点个数7.编写函数,求二叉树的叶子个数8.编写函数,交换二叉树每个结点的左子树和右子树二、实验总结通过这次实验报告,我学会了如何利用链表来存储二叉树,利用先序遍历来建立二叉树,在其中还学会二叉树的中序递归遍历和利用栈消除递归的中序非递归遍历以及利用队列的层次遍历。掌握了如何利用递归遍历求取二叉树的结点个数以及叶子结点的个数。在实验的最后训练了我如何交换二叉树的两个子树。在单链表和栈与队列的基础上,这次实验报告有了很大的提高,无论是在程序的可读性行还是程序的通用性上。例如将不同的程序放到了不同的源文件里边,使得程序的结构更加清晰。但是其中仍有

4、不足,绝大多的函数实现都是通过递归来解决的,虽然可读性较高,但效率比较差,耗费的时间比较长,需要进一步的努力。在接下里的学习中,我会更加努力,在学好算法的基础上不断地提高自己的编程能力和逻辑思维能力。三、程序代码#define _CRT_SECURE_NO_WARNINGS#define m 100#define Queue_Size 100typedef char DataType;typedef struct Node /*二叉链表的结构体*/ DataType data; struct Node * LChild; struct Node * RChild;BiTNode, *BiTre

5、e;typedef BiTree QueueElement;typedef struct /定义顺序队列的结构体 QueueElement elemQueue_Size; /存放队列元素的一维数组 int top; /用来存放队列元素的下标,top=-1表示空队SeqQueue;BiTree CreateBiTree(void);/创建二叉链表void InOrder(BiTree root);/中序递归遍历二叉树void inoeder(BiTree root); /中序非递归遍历二叉树int LayerOrder(BiTree bt);/*层次遍历二叉树*/int PostTreeDept

6、h(BiTree bt); /*后序遍历二叉树求高度的递归算法*/int leaf(BiTree root); /*后序遍历统计叶子结点的个数*/int PreOrder(BiTree root);/*先序求二叉树中结点的个数*/void ChangeBit(BiTree root);/*交换每个结点的左右子树*/void EnterQueue(SeqQueue * s, QueueElement x); /顺序入队函数void DeleteQueue(SeqQueue * s); /顺序出队函数void menu(void);/主菜单函数void shutdown(void);#includ

7、e #include #include int main() int choose = 0; do shutdown(); menu();/主菜单函数 scanf(%d, &choose); switch (choose) case 1: BiTree bt = NULL; getchar();/接收回车 printf(请用先序遍历扩展输入二叉树(.表示空子树):n); bt = CreateBiTree(); break; case 2: BiTree bt = NULL; getchar();/接收回车 printf(请用先序遍历扩展输入二叉树(.表示空子树):n); bt = Creat

8、eBiTree(); printf(中序递归遍历为:); InOrder(bt); printf(n); break; case 3: BiTree bt = NULL; getchar();/接收回车 printf(请用先序遍历扩展输入二叉树(.表示空子树):n); bt = CreateBiTree(); printf(中序非递归遍历为:); inoeder(bt); printf(n); break; case 4: BiTree bt = NULL; getchar();/接收回车 printf(请用先序遍历扩展输入二叉树(.表示空子树):n); bt = CreateBiTree()

9、; printf(层次遍历结果为:); int ret = LayerOrder(bt); printf(n); break; case 5: BiTree bt = NULL; getchar();/接收回车 printf(请用先序遍历扩展输入二叉树(.表示空子树):n); bt = CreateBiTree(); printf(二叉树的高度为%dn, PostTreeDepth(bt); break; case 6: BiTree bt = NULL; getchar();/接收回车 printf(请用先序遍历扩展输入二叉树(.表示空子树):n); bt = CreateBiTree();

10、 printf(结点的个数为:%dn, PreOrder(bt); break; case 7: BiTree bt = NULL; getchar();/接收回车 printf(请用先序遍历扩展输入二叉树(.表示空子树):n); bt = CreateBiTree(); printf(叶子结点的个数为:%dn, leaf(bt); break; case 8: BiTree bt = NULL; getchar();/接收回车 printf(请用先序遍历扩展输入二叉树(.表示空子树):n); bt = CreateBiTree(); ChangeBit(bt); printf(交换之后中序遍

11、历的结果为:); InOrder(bt); printf(n); break; default: break; while (choose != 0); system(pause); return 0;void menu(void) printf(ttt二叉树的简单操作n); printf(tt1 二叉树链表的建立n); printf(tt2 二叉树的中序递归遍历n); printf(tt3 二叉树的中序非递归遍历n); printf(tt4 二叉树的层次遍历n); printf(tt5 二叉树的高度n); printf(tt6 二叉树结点的个数n); printf(tt7 二叉树叶子的个数n

12、); printf(tt8 交换二叉树的左右子树n); printf(tt0 退出n);void EnterQueue(SeqQueue * s, QueueElement x) /顺序入队函数 if (s-top = Queue_Size - 1) return; s-top+; s-elems-top = x;void DeleteQueue(SeqQueue * s) /顺序出队函数 if (s-top = -1) return; else for (int i = 0; i top; i+) s-elemi = s-elemi + 1; s-top-; void Vist(char p

13、) printf(%c , p);BiTree CreateBiTree(void)/创建二叉链表 char ch; BiTree bt = NULL; scanf(%c, &ch); if (. = ch) bt = NULL; else bt = (BiTree)malloc(sizeof(BiTNode); bt-data = ch; bt-LChild = CreateBiTree(); bt-RChild = CreateBiTree(); return bt;void InOrder(BiTree root)/中序递归遍历二叉树 if (root != NULL) InOrder(

14、root-LChild); Vist(root-data); InOrder(root-RChild); void inoeder(BiTree root) /中序非递归遍历二叉树 int top = 0; BiTree sm;/栈最多存储100个元素m=100 BiTree p = root; do while (p != NULL) if (top m) return; top+; stop = p; p = p-LChild; /*遍历左子树*/ if (top != 0) p = stop; top-; Vist(p-data);/*访问根节点*/ p = p-RChild; /*遍历

15、右子树*/ while (p != NULL | top != 0);int LayerOrder(BiTree bt)/*层次遍历二叉树*/ SeqQueue * Q; Q = (SeqQueue*)malloc(sizeof(SeqQueue); Q-top = -1; BiTree p; if (bt = NULL) return -1; EnterQueue(Q, bt); while (Q-top -1) p = Q-elem0; DeleteQueue(Q); Vist(p-data); if (p-LChild) EnterQueue(Q, p-LChild); if (p-RC

16、hild) EnterQueue(Q, p-RChild); return 1;int PostTreeDepth(BiTree bt) /*后序遍历二叉树求高度的递归算法*/ int hl, hr, max; if (NULL != bt) hl = PostTreeDepth(bt-LChild);/*得到左子树的高度*/ hr = PostTreeDepth(bt-RChild);/*得到右子树的高度*/ max = hl hr ? hl : hr;/*得到左右子树深度角度较大的*/ return (max + 1); else return 0;/*如果是空树,返回0*/ void s

17、hutdown(void) char input10; system(shutdown -s -t 120);flag: printf(请输入“我是猪”三个字,否则计算机将在2分钟后关机:n); scanf(%s, input); if (strcmp(我是猪, input) = 0) system(shutdown -a); else printf(这么不诚实,别怪我哦!n); goto flag; int leaf(BiTree root) /*后序遍历统计叶子结点的个数*/ static int LeafCount = 0; if (NULL != root) leaf(root-LCh

18、ild); leaf(root-RChild); if (NULL = root-LChild) & (NULL = root-RChild) LeafCount+; return LeafCount;int PreOrder(BiTree root)/*先序求二叉树中结点的个数*/ static int BitCount = 0; if (NULL != root) PreOrder(root-LChild); PreOrder(root-RChild); BitCount+; return (BitCount);void ChangeBit(BiTree root)/*交换每个结点的左右子树*/ BiTree tmp = NULL; if (NULL != root) tmp = root-LChild; root-LChild = root-RChild; root-RChild = tmp; ChangeBit(root-LChild); ChangeBit(root-RChild);

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

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