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