数据结构遍历二叉树课程设计报告
二叉树《数据结构》课程设计报告-目录及正文

目录1 前言 (1)2 需求分析 (1)2.1课程设计目的 (1)2.2课程设计任务 (1)2.3设计环境 (1)3 概要设计 (1)3.1数据结构设计 (2)3.2模块设计 (3)4详细设计 (3)5 测试分析 (13)6 课程设计总结 (18)参考文献 (19)致谢 (19)1 前言编写一个程序来处理二叉树的存储及各种非递归遍历输出。
实现二叉树的广义表表示法输出二叉树,二叉树的先序、中序、后序以及层次遍历。
通过栈、队列来实现。
针对现实世界中如今许多关系复杂的数据,如人类社会的家谱,各种社会组织机构,博弈交通等复杂事物或过程以及客观世界中广泛存在的具有分支关系或层次特性的对象,如人工智能和算法分析的模型表示以及数据库系统的信息组织形式等,用线性结构难以把其中的逻辑关系表达出来,必须借助于数和图这样的非线性结构,因此在以模拟客观世界问题,解决客观世界问题为主要任务的计算机领域中树型结构是信息的一种重要组织形式,树有着广泛应用。
2 需求分析2.1课程设计目的学生在教师指导下运用所学课程的知识来研究、解决一些具有一定综合性问题的专业课题。
通过课程设计(论文),提高学生综合运用所学知识来解决实际问题、使用文献资料、及进行科学实验或技术设计的初步能力,为毕业设计(论文)打基础。
2.2课程设计任务先序、中序、后序及层次遍历的非递归遍历算法的实现,应包含建树的实现。
2.3设计环境(1)WINDOWS 2000/2003/XP/7/Vista系统(2)Visual C++或TC集成开发环境3 概要设计通过一个二叉链表对二叉树存储,其中每个结点包括左孩子指针、右孩子指针和双亲结点表示值。
通过一个顺序栈对二叉树先中序遍历的结点存储,其中包括一个下标指针和二叉树结点数组。
通过一个顺序栈对二树后序遍历的结点存储,其中包括一个下标指针和二叉树结点和值的数组。
通过一个顺序队列对二叉树层次遍历的结点存储,其中包括头尾指针和一个结点。
数据结构课程设计(二叉排序树:用顺序表结构存储)报告

教师签字
日期:2013-1-5
4.在删除函数中,最重要的是建立了一个新的数组,并且初始化了该数组,然后将不需要删除的节点保存到该数组中,当删除了指定的数据后,最后返回该数组,并且在对其进行中序遍历,输出。
最后的效果:
输入数据,提示选项,“0”代表退出该程序,“1”代表对给定的数组数据进行中序遍历,“2”代表对给定数据计算平均查找长度,“3”代表删除数据中的节点,并且在中序遍历后输出剩余的数据。
课程设计成绩表
班级:
XXXXX学号:XXX姓名:XXXX
课题名称:
数据结构课程设计(二叉排序树:用顺序表结构存储)
主要工作描述(包括系统实现的主要功能、使用的关键数据结构及算法思想描述、最后的效果):
主要功能:
手动输入一串数字,用“0”代表输入完成,然后通过代码,对这一串数据进行中序遍历,并且输出;其次,可以对该数列进行计算平均查找长度;最后是可以删除该数列中的节点,并且再通过中序遍历后,输出。
使用的关键数据结构及算法思想:
1.运用到了完全搜索二叉树,通过数组的数据,边查找边插入来建立二叉排序树,并且记录结点个数;
2.还运用了中序遍历,通过左子树,根节点,右子树的顺序输出节点;
3.在计算平均查找长度的时候,记录当前结点的在当前树中的深度,再记录已遍历过的点的深度之和,从而得以计算出平均查找长度;
数据结构_二叉树的遍历_课程设计_实验报告

2.1.1 用单链表 s 记录输入的数据 2.1.2 利用非递归调用分别生成根节点的左子树和右子树。 2.1.3 返回菜单重新选择。
基本程序如下:
void CreatBiTree_q(BiTree &T)/ { · · · · · · if(ch=='#') T=NULL; else { T=(BiTree)malloc(sizeof(BiTNode)); if(!T) exit(0); T->data=ch; T->LTag=Link; T->RTag=Link;
5
int right=0; typedef char TElemType;
typedef struct BiTNode { TElemType data; struct BiTNode *lchild,*rchild; int LTag, RTag,flag; }BiTNode,*BiTree; BiTree pre; void CreatBiTree_q(BiTree &T) { TElemType ch; scanf("%c",&ch); if(ch=='#') T=NULL; else { T=(BiTree)malloc(sizeof(BiTNode)); if(!T) exit(0); T->data=ch; T->LTag=Link; T->RTag=Link; CreatBiTree_q(T->lchild); CreatBiTree_q(T->rchild); } } void CreateBiTree(BiTree *T) { TElemType ch; scanf("%c",&ch); if(ch=='#') *T=NULL; else { *T=(BiTree)malloc(sizeof(BiTNode)); if(!*T) exit(-1); (*T)->data=ch;
数据结构_二叉树的遍历_课程设计

8
if(bt!=NULL)/*二叉树 bt 非空*/ { inorder(bt->lchild);/*中序遍历 bt 的左子树*/ printf("%c",bt->data);/*访问结点 bt*/ inorder(bt->rchild);/*中序遍历 bt 的右子树*/ } } void postorder(bitree *bt)/*后序序遍历二叉树*/ { if(bt!=NULL) { postorder(bt->lchild); postorder(bt->rchild); printf("%c",bt->data); } }
3.2.2 二叉树的中序递归遍历算法
void inorder(bitree *bt)/*中序序遍历二叉树*/ { if(bt!=NULL)/*二叉树 bt 非空*/ { inorder(bt->lchild);/*中序遍历 bt 的左子树*/ printf("%c",bt->data);/*访问结点 bt*/ inorder(bt->rchild);/*中序遍历 bt 的右子树*/ } }
图 1 “菜单”界面
图2
创建二叉树
5
图 3 二叉树的先序遍历
图4
二叉树的中序输出
6
图 5 二叉树的后序输出
五:实验总结 虽然做的过程中出现很多错误。但是最后还是一一纠正了,并在其中发现了自 身的不足,补学补差。最后终于完成了。
六:源程序附录
#include<stdio.h> #include<stdlib.h> typedef char datatype; typedef struct node { datatype data;/*数据元素*/ struct node *lchild,*rchild;/*指向左,右孩子*/ }bitree; bitree *root;/*二叉树结点类型定义*/ bitree *creatbitree(bitree *root)/*创建二叉树*/ { char ch;
数据结构实验报告-二叉树的实现与遍历

《数据结构》第六次实验报告学生学生班级学生学号指导老师一、实验容1) 采用二叉树链表作为存储结构,完成二叉树的建立,先序、中序和后序以及按层次遍历的操作,求所有叶子及结点总数的操作。
2) 输出树的深度,最大元,最小元。
二、需求分析遍历二叉树首先有三种方法,即先序遍历,中序遍历和后序遍历。
递归方法比较简单,首先获得结点指针如果指针不为空,且有左子,从左子递归到下一层,如果没有左子,从右子递归到下一层,如果指针为空,则结束一层递归调用。
直到递归全部结束。
下面重点来讲述非递归方法:首先介绍先序遍历:先序遍历的顺序是根左右,也就是说先访问根结点然后访问其左子再然后访问其右子。
具体算法实现如下:如果结点的指针不为空,结点指针入栈,输出相应结点的数据,同时指针指向其左子,如果结点的指针为空,表示左子树访问结束,栈顶结点指针出栈,指针指向其右子,对其右子树进行访问,如此循环,直至结点指针和栈均为空时,遍历结束。
再次介绍中序遍历:中序遍历的顺序是左根右,中序遍历和先序遍历思想差不多,只是打印顺序稍有变化。
具体实现算法如下:如果结点指针不为空,结点入栈,指针指向其左子,如果指针为空,表示左子树访问完成,则栈顶结点指针出栈,并输出相应结点的数据,同时指针指向其右子,对其右子树进行访问。
如此循环直至结点指针和栈均为空,遍历结束。
最后介绍后序遍历:后序遍历的顺序是左右根,后序遍历是比较难的一种,首先需要建立两个栈,一个用来存放结点的指针,另一个存放标志位,也是首先访问根结点,如果结点的指针不为空,根结点入栈,与之对应的标志位也随之入标志位栈,并赋值0,表示该结点的右子还没有访问,指针指向该结点的左子,如果结点指针为空,表示左子访问完成,父结点出栈,与之对应的标志位也随之出栈,如果相应的标志位值为0,表示右子树还没有访问,指针指向其右子,父结点再次入栈,与之对应的标志位也入栈,但要给标志位赋值为1,表示右子访问过。
如果相应的标志位值为1,表示右子树已经访问完成,此时要输出相应结点的数据,同时将结点指针赋值为空,如此循环直至结点指针和栈均为空,遍历结束。
数据结构课程设计报告_遍历二叉树

数据结构课程设计报告_遍历⼆叉树XXXX⼤学《数据结构》课程设计报告课题名称: 遍历⼆叉树系(院):专业:班级:组员姓名:学号:指导教师:开课时间: 学年学期摘要树结构在客观世界中⼴泛存在, 如⼈类社会的族谱和各种社会组织机构都可⽤树形象表⽰. 树在计算机领域中也得到⼴泛应⽤,如在编译源程序时, 可⽤树表⽰源程序的语法结构. ⼜如在数据库系统中, 树型结构也是信息的重要组织形式之⼀. ⼀切具有层次关系的问题都可⽤树来描述.针对这样的问题, 我选择了⼆叉树的遍历作为我的课程设计主题, 编写程序, 实现对⼆叉树的遍历. 在本次课程设计中, ⼆叉树的建⽴使⽤了递归算法;在前序、中序和后续遍历的算法中则同时使⽤了递归与⾮递归的算法, 即在这些遍历算法的实现中使⽤了栈结构与队列结构, 提供了6种不同的遍历⽅式, 供使⽤者选择. 同时, 该程序具有输出层序遍历的功能, 层序遍历模块使⽤了⾮递归算法. 该程序基本实现了对⼆叉树的遍历, 对于递归与⾮递归算法, 我们应从实际应⽤中体验这些算法的优越性.关键词: 层次关系, ⼆叉树建⽴, 递归与⾮递归, 遍历, 栈, 队列⽬录⼀、问题描述 (1)⼆、需求分析 (1)2.1主功能模块 (1)2.2创建树模块 (1)2.3遍历树模块 (1)三、概要设计 (2)3.1主界⾯设计思想流程图 (2)3.2. 创建⼆叉树 (2)3.2.1⼆叉树创建的思想 (2)3.2.2⼆叉树创建的算法流程图 (2)3.3.先序递归遍历 (3)3.3.1先序递归遍历思想 (3)3.3.2先序递归遍历的算法流程图 (3)3.4.中序递归遍历 (3)3.4.1中序递归遍历思想 (3)3.4.2中序递归遍历的算法流程图 (4) 3.5.后序递归遍历 (4)3.5.1后序递归遍历思想 (4)3.5.2后序递归遍历的算法流程图 (5) 3.6.先序⾮递归遍历 (5)3.6.1先序⾮递归遍历思想 (5)3.6.2先序⾮递归遍历的算法流程图 (6) 3.7.中序⾮递归遍历 (6)3.7.1中序⾮递归遍历思想 (6)3.7.2中序⾮递归遍历的算法流程图 (7) 3.8.后序⾮递归遍历 (7)3.8.1后序⾮递归遍历思想 (7)3.8.2后序⾮递归遍历的算法流程图 (8) 3.9.层序⾮递归遍历 (8)3.9.1层序⾮递归遍历思想 (8)3.9.2层序⾮递归遍历的算法流程图 (9)四、详细设计 (10)4.1界⾯设计 (10)4.2.详细代码分析 (11)4.2.1主模块 (11)4.2.2创建树模块 (12)4.2.3遍历树模块 (13)五、调试分析 (13)5.1.调试结果 (13)5.1.1实验数据 (13)5.1.2创建树界⾯ (14)5.1.3输出结果界⾯ (14)5.2.算法分析 (16)5.2.1时间复杂度 (16)5.2.2空间复杂度 (16)5.3.程序的不⾜ (16)5.3.1程序不⾜之处 (16)六、⼼得体会 (17)七、参考⽂献 (17)⼀、问题描述建⽴⼆叉树, 层序、先序、中序、后序遍历.(⽤递归或⾮递归的⽅法都可以)要求能够输⼊树的各个结点, 并能够输出⽤不同⽅法遍历的遍历序列;分别建⽴⼆叉树存储结构的的输⼊函数、输出层序遍历序列的函数、输出先序遍历序列的函数、输出中序遍历序列的函数、输出后序遍历序列的函数.⼆、需求分析在现实世界层次化的数据模型中, 数据与数据之间的关系纷繁复杂. 其中很多关系⽆法使⽤简单的线性结构表⽰清楚, ⽐如祖先与后代的关系、整体与部分的关系等. 于是⼈们借鉴⾃然界中树的形象创造了⼀种强⼤的⾮线性结构——树. 树形结构的具体形式有很多种, 其中最常⽤的就是⼆叉树. ⽽⼆叉树的多层次遍历遍历则是⼆叉树的重要内容.本程序⽤Microsoft Visual C++ 6.0编写, 可以实现对⼆叉树的创建、采⽤递归和⾮递归等两种⽅式先序、中序、后序进⾏遍历.2.1主功能模块通过合理的界⾯设计, 根据提⽰信息, 使⽤者可以⽅便快捷地运⾏本程序来完成创建、遍历⼆叉树等操作. 界⾯美观, ⼈性化, 程序智能, 安全性⾼.2.2创建树模块当进⼊程序运⾏界⾯后, 根据提⽰输⼊需要建⽴的⼆叉树, 按照先序次序输⼊各个结点的值, 完成⼆叉树的建⽴.2.3遍历树模块实现对该⼆叉树的先序递归遍历、先序⾮递归遍历、中序递归遍历、中序⾮递归遍历、后序递归遍历、后序⾮递归遍历、层序⾮递归遍历等⽅式的遍历操作, 并输出各遍历序列.三、概要设计3.1主界⾯设计思想流程图3.2. 创建⼆叉树3.2.1⼆叉树创建的思想(1)定义⼆叉树结点值的类型为字符型.(2)结点个数不超过10个.(3)按先序次序输⼊, 构造⼆叉链表表⽰的⼆叉树T, 空格表⽰空树. 相关函数如下:void CreateBiTree(BiTree &T)3.2.2⼆叉树创建的算法流程图3.3.先序递归遍历3.3.1先序递归遍历思想若⼆叉树为空, 则空操作;否则(1)访问根结点;(2)先序遍历左⼦树;(3)先序遍历右⼦树. 相关函数如下: void PreOrderTraverse(BiTree T) 3.3.2先序递归遍历的算法流程图3.4.中序递归遍历3.4.1中序递归遍历思想若⼆叉树为空, 则空操作;否则(1)中序遍历左⼦树;(2)访问根结点;(3)中序遍历右⼦树. 相关函数如下: void InOrderTraverse(BiTree T) 3.4.2中序递归遍历的算法流程图3.5.后序递归遍历3.5.1后序递归遍历思想若⼆叉树为空, 则空操作;否则(1)后序遍历左⼦树;(2)后序遍历右⼦树;(3)访问根结点. 相关函数如下: void PostOrderTraverse(BiTree T)3.6.先序⾮递归遍历3.6.1先序⾮递归遍历思想(1)访问结点的数据域;(2)指针指向p的左孩⼦结点;(3)从栈中弹出栈顶元素;(4)指针指向p的右孩⼦结点. 相关函数如下: void NRPreOrder(BiTree bt)3.7.中序⾮递归遍历3.7.1中序⾮递归遍历思想(1)指针指向p的左孩⼦结点;(2)从栈中弹出栈顶元素;(3)访问结点的数据域;(4)指针指向p的右孩⼦结点. 相关函数如下: void NRInOrder(BiTree bt)3.7.2中序⾮递归遍历的算法流程图3.8.后序⾮递归遍历3.8.1后序⾮递归遍历思想若⼆叉树为空, 则空操作;否则引⼊栈和标记模拟递归⼯作栈, 初始时栈为空. 相关函数如下: void NRPostOrder(BiTree bt);3.8.2后序⾮递归遍历的算法流程图3.9.层序⾮递归遍历3.9.1层序⾮递归遍历思想(1)访问该元素所指结点.(2)若该元素所指结点的左右孩⼦结点⾮空, 则该元素所指结点的左孩⼦指针和右孩⼦指针顺序⼊队. 相关函数如下: void LevelOrderTraverse(BiTree T)3.9.2层序⾮递归遍历的算法流程图四、详细设计4.1界⾯设计图4-1 系统运⾏主界⾯图4-2 创建⼆叉树界⾯图4-3 ⼆叉树递归遍历界⾯4.2.详细代码分析4.2.1主模块本模块定义了系统运⾏主界⾯的相关内容和相关操作函数, 源代码如下: void main(){BiTree T;T=NULL;int select;//cout<<"请按先序次序输⼊各结点的值, 以空格表⽰空树(输⼊时可连续输⼊):"< while(1){cout<<"\n\n请选择要执⾏的操作:\n";cout<<"1.创建⼆叉树\n";cout<<"2.⼆叉树的递归遍历算法(前、中、后)\n";cout<<"3.⼆叉树的层次遍历算法\n";cout<<"4.⼆叉树的⾮递归遍历算法(前、中、后)\n";cout<<"0.退出\n";cin>>select;switch(select){case 0:return;case 1:cout<<"请按先序次序输⼊各结点的值, 以空格表⽰空树(输⼊时可连续输⼊):"< CreateBiTree(T);break;case 2:if(!T) cout<<"未建⽴树, 请先建树!";else{cout<<"\n先序遍历:\n";PreOrderTraverse(T);cout<<"\n中序遍历:\n";InOrderTraverse(T);cout<<"\n后序遍历:\n";PostOrderTraverse(T);}break;case 3:cout<<"\n层序遍历:\n";LevelOrderTraverse(T);break;case 4:if(!T) cout<<"未建⽴树, 请先建树!";else{cout<<"\n先序遍历:\n";NRPreOrder(T);cout<<"\n中序遍历:\n";NRInOrder(T);cout<<"\n后序遍历:\n";NRPostOrder(T);}break;default:cout<<"请确认选择项:\n";}//end switch}//end while}4.2.2创建树模块源代码如下:void CreateBiTree(BiTree &T){//按先序次序输⼊, 构造⼆叉链表表⽰的⼆叉树T, 空格表⽰空树// if(T) return;char ch;ch=getchar(); //不能⽤cin来输⼊, 在cin中不能识别空格.if(ch==' ') T=NULL;else{if(!(T=(BTNode *)malloc(sizeof(BTNode)))) cout<<"malloc fail!";T->data=ch;CreateBiTree(T->lchild);CreateBiTree(T->rchild);}}4.2.3遍历树模块本模块包括了各种遍历⼆叉树的函数, 源代码如下:void PreOrderTraverse(BiTree T) //⼆叉树的先序遍历(递归)成员函数声明void InOrderTraverse(BiTree T) //⼆叉树的中序遍历(递归)成员函数声明void PostOrderTraverse(BiTree T) //⼆叉树的后序遍历(递归)成员函数声明void LevelOrderTraverse(BiTree T) // ⼆叉树的层序遍历(⾮递归)成员函数声明void NRPreOrder(BiTree bt) // ⼆叉树的先序遍历(⾮递归)成员函数声明void NRInOrder(BiTree bt) //⼆叉树的中序遍历(⾮递归)成员函数声明void NRPostOrder(BiTree bt) //⼆叉树的后序遍历(⾮递归)成员函数声明五、调试分析5.1.调试结果5.1.1实验数据这棵树是随机画的, 由数据结构知识, 按照先序次序输⼊各个节点的值为: ABD###CEG###F#H##(此处#代表空格). 在程序中输⼊这些节点, 创建树, 如下图:5.1.2创建树界⾯图5-1 创建树界⾯5.1.3输出结果界⾯输⼊2, 输出该⼆叉树递归遍历算法的遍历结果, 结果如下:输⼊3, 输出该⼆叉树层序遍历算法的遍历结果, 结果如下:输⼊4, 输出该⼆叉树⾮递归遍历算法的遍历结果, 结果如下:。
数据结构课程设计报告-最短路径算法-二叉树的三种遍历

数据结构课程设计报告班级:计算机科学与技术132班姓名:赖恒财指导教师:董跃华成绩:32信息工程学院2015 年7月8日目录图的最短路径算法实现1. 需求分析 (1)1.1 程序设计内容 (1)1.2 设计要求 (1)2.概要设计 (2)3.详细设计 (2)3.1 数据类型的定义 (2)3.2 功能模块的设计 (2)3.3 主程序流程 (9)4.调试分析 (10)4.1 问题回顾和分析 (10)4.2.经验和体会 (11)5.测试结果 (12)二叉树的遍历1.设计目的 (13)2.需求分析 (14)2.1课程设计的内容和要求 (14)2.2选题的意义及背景 (14)3.概要设计 (14)3.1设计思想 (14)3.2程序数据类型 (16)3.3程序模块分析 (16)3.3.1置空栈 (16)3.3.2入栈 (17)3.3.3出栈 (17)3.3.4取栈顶操作 (17)3.3.5判空栈 (17)3.4函数关系: (18)4.详细设计 (18)4.1二叉树算法程序截图和结果 (18)5.程序测试结果及问题分析 (19)6.总结 (20)参考文献 (21)附录1 (22)附录2 (26)图的最短路径算法实现----基于floyd最短路径算法1.需求分析设计校园平面图,所含景点不少于8个。
以图中顶点表示学校内各景点,存放景点的名称、景点介绍信息等;以边表示路径,存放路径长度信息。
要求将这些信息保存在文件graph.txt中,系统执行时所处理的数据要对此文件分别进行读写操作。
1.1程序设计内容1.从文件graph.txt中读取相应数据, 创建一个图,使用邻接矩阵表示图;2.景点信息查询:为来访客人提供校园任意景点相关信息的介绍;3.问路查询:为来访客人提供校园任意两个景点之间的一条最短路径。
1.2 设计要求(1) 程序要具在一定的健壮性,即当输入数据非法时,程序也能适当地做出反应。
(2) 程序要添加适当的注释,程序的书写要采用缩进格式。
数据结构二叉树遍历实验报告

数据结构二叉树遍历实验报告正文:1.实验目的本实验旨在实现二叉树的四种遍历方式:前序遍历、中序遍历、后序遍历和层次遍历,并对其进行验证和性能评估。
2.实验原理2.1 二叉树的定义二叉树是一种特殊的树状结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。
2.2 二叉树的遍历方式2.2.1 前序遍历前序遍历的顺序是先访问根节点,然后递归地遍历左子树和右子树。
2.2.2 中序遍历中序遍历的顺序是先递归地遍历左子树,然后访问根节点,最后递归地遍历右子树。
2.2.3 后序遍历后序遍历的顺序是先递归地遍历左子树和右子树,最后访问根节点。
2.2.4 层次遍历层次遍历按照二叉树的层次从上到下、从左到右的顺序遍历节点。
3.实验内容3.1 实现二叉树的数据结构首先,我们需要定义二叉树的数据结构。
二叉树节点应包含键值和左右子节点的指针。
3.2 实现二叉树的各种遍历方式接下来,我们实现四种遍历方式:前序遍历、中序遍历、后序遍历和层次遍历。
针对每种遍历方式,编写相应的算法实现逻辑。
3.3 实验验证和性能评估使用已实现的算法,对一棵二叉树进行各种遍历方式操作,并将结果输出。
验证输出结果与预期结果是否一致。
同时,记录每种遍历方式的算法时间复杂度和空间复杂度,并进行性能评估。
4.实验结果与分析对于给定的二叉树,分别进行了前序遍历、中序遍历、后序遍历和层次遍历操作,并得到了相应的输出结果。
结果与预期相符。
通过对算法的时间复杂度和空间复杂度的计算和分析,可以看出各种遍历方式的效率和资源消耗情况。
5.结论本实验成功实现了二叉树的四种遍历方式,并验证了其正确性。
同时,对这些遍历方式的性能进行了评估,为后续使用二叉树进行数据操作提供了参考。
附件:无法律名词及注释:- N/A。
数据结构二叉树的遍历实验报告

实验报告填写说明
(实验项目名称、实验项目类型必须与实验教学大纲保持一致)
1.实验环境:
实验用的软、硬件环境。
2.实验目的:
根据实验教学大纲,写出实验的要求和目的。
3.实验原理:
简要说明本实验项目所涉及的理论知识。
4.实验方案:
这是实验报告极其重要的容。
对于验证性验,要写清楚操作方法,需要经过哪几个步骤来实现其操作。
对于设计性和综合性实验,还应写出设计思路和设计方法。
对于创新性实验,还应注明其创新点。
5.实验过程:
写明执行实验方案的实验过程。
6.实验结论:
根据实验过程中得到的结果,做出结论。
7.实验小结:
本次实验的体会和建议。
8.指导教师评语及成绩:
指导教师依据学生的实际报告内容,给出本次实验报告的评价和成绩。
(3)查找错误
(4)改正错误,重新编译
7实验小结(收获体会)
通过这次试验,掌握了二叉链表的特点及基本运算。
8指导教师评语及成绩:
附录1:源程序。
数据结构二叉树遍历实验报告简版

数据结构二叉树遍历实验报告数据结构二叉树遍历实验报告1. 实验目的本实验旨在通过实现二叉树的前序、中序和后序遍历算法,加深对二叉树遍历的理解,并验证算法的正确性。
2. 实验原理2.1 二叉树二叉树是一种特殊的树状数据结构,它的每个节点最多只能有两个子节点。
二叉树可以为空树,也可以是由根节点、左子树和右子树组成的非空树。
2.2 遍历算法二叉树的遍历算法包括前序遍历、中序遍历和后序遍历。
- 前序遍历:先访问根节点,然后依次递归访问左子树和右子树。
- 中序遍历:先递归访问左子树,然后访问根节点,最后递归访问右子树。
- 后序遍历:先递归访问左子树,然后递归访问右子树,最后访问根节点。
3. 实验过程3.1 数据结构设计首先,我们需要设计表示二叉树的数据结构。
在本次实验中,二叉树的每个节点包含三个成员变量:值、左子节点和右子节点。
我们可以使用面向对象编程语言提供的类来实现。
具体实现如下:```pythonclass TreeNode:def __init__(self, val=0, left=None, right=None): self.val = valself.left = leftself.right = right```3.2 前序遍历算法前序遍历算法的实现主要包括以下步骤:1. 若二叉树为空,则返回空列表。
2. 创建一个栈,用于存储遍历过程中的节点。
3. 将根节点入栈。
4. 循环执行以下步骤,直到栈为空:- 弹出栈顶节点,并将其值添加到结果列表中。
- 若当前节点存在右子节点,则将右子节点压入栈。
- 若当前节点存在左子节点,则将左子节点压入栈。
具体实现如下:```pythondef preorderTraversal(root):if not root:return []stack = []result = []stack.append(root)while stack:node = stack.pop()result.append(node.val)if node.right:stack.append(node.right)if node.left:stack.append(node.left)return result```3.3 中序遍历算法中序遍历算法的实现主要包括以下步骤:1. 若二叉树为空,则返回空列表。
(完整word版)二叉树的遍历--课程设计

课程设计课程设计名称:数据结构课程设计专业班级:学生姓名:学号:指导教师:课程设计时间:数据结构专业课程设计任务书说明:本表由指导教师填写,由教研室主任审核后下达给选题学生,装订在设计(论文)首页一、需求分析1.1课程设计题目、任务及要求二叉树.用链表作存储结构(1)对二叉树作各种遍历,输出结果;(4)输入元素x,查找二叉树的左孩子,右孩子,如果找到则删除该结点,没有找到就退出,返回错误。
1.2课程设计思想建立二叉树采用一个一个输入的方式。
对二叉树进中序遍历采用递归函数和非递归函数分别实现多种遍历的方式。
另外还有层次遍历,来充分实现本书对树的遍历。
删除结点函数,采用边查找边删除的方式。
如果没有查找到,则不对树做任何的修改;如果查找到结点则删除.一、系统总体设计3。
1 系统模块划分二叉树是一种动态树表。
开辟一个空间建立一个节点,逐个加入,逐个建立。
利用查找函数,对数进行插入删除利用书中所学知识进行各种遍历,包括将所有方法归并在一起,还要建立查看界面一边有系统的视觉效果.3.2 二叉树的生成过程二叉树的生成,采用逐个建立的方式。
如图3。
3 主要功能模块设计程序主要设计了五个功能:首先是创建二叉排序树,完成后出现任务菜单,菜单中设计了四个模块:退出,中序遍历,计算平均查找长度和删除结点。
主函数流程如下:图3。
1.1主函数流程图4 系统详细设计4.1 主函数菜单模块该模块功能主要是给用户提供清晰的可操作界面,易于人机操作,并能很好的调用其他各模块,使程序更加优化,丝路更加清晰,结构更加明了,提高了程序的实用性。
其算法如下:(完整word版)二叉树的遍历--课程设计void main(){int n,m=1;BiTree t;while(m){menu();scanf("%d”,&n);switch(n){case 1:{/*初始化*/int flag;datatype x;printf(”请输入头结点x:\n");scanf("%d”,&x);flag=Initiate(&t,x);if(flag==1)printf(”\n初始化成功!”);elseprintf(”\n初始化失败!”);break;}case 2:{printf(”\n请继续添加结点建立二叉树”);/*建树*/ break;}case 3:{/*插入结点x作为a的左孩子*/datatype a,x;/*x作为a的左孩子*/BiTree parent=t;printf("请输入双亲a和左孩子x:\n");scanf(”%d%d",&a,&x);parent=Find(parent,a);parent=InsertL(t,x,parent);if(parent!=NULL)t=parent;break;}case 4:{/*插入结点x作为a的右孩子*/datatype a,x;/*x作为a的右孩子*/ BiTree parent=t;printf("请输入双亲a and右孩子x:\n”);scanf(”%d%d",&a,&x);parent=Find(parent,a);parent=InsertR(t,x,parent);if(parent!=NULL)t=parent;break;}case 5:{/*删除结点a的左孩子*/ datatype a;BiTree parent=t;printf(”please input a:\n”);scanf(”%d”,&a);parent=Find(parent,a);parent=DeleteL(t,parent);if(parent!=NULL)t=parent;break;}case 6:{/*删除结点a的左孩子*/ datatype a;BiTree parent=t;printf("please input a:\n"); scanf("%d",&a);parent=Find(parent,a);parent=DeleteR(t,parent);if(parent!=NULL)t=parent;break;}case 7:{/*递归先序遍历*/ PreOrder(t);break;}case 8:{/*递归中序遍历*/ InOrder(t);break;}case 9:{/*递归后序遍历*/ PostOrder(t);break;}case 10:{/*层次遍历*/ LevelOrder(t);break;}case 11:{/*先序遍历的非递归实现*/ NRPreOrder(t);break;}case 12:{/*中序遍历的非递归实现*/ NRInOrder(t);break;}case 13:{/*后序遍历的非递归实现*/NRPostOrder(t);break;}case 0:m=0;}}}4。
二叉树递归遍历数据结构实验报告

二叉树递归遍历数据结构实验报告一、引言二叉树是一种简单而重要的树形结构,在计算机科学领域中被广泛应用。
它具有良好的动态性能和数据组织能力,递归遍历是二叉树最基本的操作之一、本次实验旨在通过编程实现二叉树的递归遍历算法,并对实验结果进行分析和总结。
二、实验目的1.掌握二叉树的基本概念和操作方法;2.熟悉递归算法的实现过程;3.实践二叉树的递归遍历算法。
三、实验原理1.二叉树的概念二叉树是一种树形结构,其中每个节点最多有两个子节点,被分为左子树和右子树。
树中每个节点最多有一个父节点,除了根节点没有父节点。
二叉树的递归定义:(1)空树是一个二叉树;(2)一棵非空二叉树由根节点和左子树、右子树组成。
2.二叉树的递归遍历二叉树的遍历方式分为三种:前序遍历、中序遍历和后序遍历。
其定义如下:(1)前序遍历:根节点->左子树->右子树;(2)中序遍历:左子树->根节点->右子树;(3)后序遍历:左子树->右子树->根节点。
四、实验过程1.定义二叉树的数据结构和相关操作方法首先,我们需要定义二叉树的节点结构,包含数据域和左右子节点指针域。
然后,可定义插入节点、删除节点等操作方法。
2.实现递归遍历算法(1)前序遍历前序遍历的流程为:先访问根节点,再前序遍历左子树,最后前序遍历右子树。
通过递归调用即可实现。
伪代码如下:```void preOrder(Node* root)if (root != NULL)cout << root->data;preOrder(root->left);preOrder(root->right);}(2)中序遍历和后序遍历与前序遍历类似,中序遍历的流程为:先中序遍历左子树,再访问根节点,最后中序遍历右子树。
后序遍历的流程为:先后序遍历左子树,再后序遍历右子树,最后访问根节点。
也可以通过递归调用实现。
伪代码如下:```void inOrder(Node* root)if (root != NULL)inOrder(root->left);cout << root->data;inOrder(root->right);}void postOrder(Node* root)if (root != NULL)postOrder(root->left);postOrder(root->right);cout << root->data;}五、实验结果与分析我们通过编写测试数据并调用递归遍历算法进行遍历,得到以下结果:(1)前序遍历结果:ABDECFG(2)中序遍历结果:DBEAFCG(3)后序遍历结果:DEBFGCA实验结果与预期相符,表明递归遍历算法编写正确。
二叉树的建立和遍历实验报告

二叉树的建立和遍历实验报告一、引言(100字)二叉树是一种常见的数据结构,它由根节点、左子树和右子树组成,具有递归性质。
本次实验的目的是了解二叉树的建立过程和遍历算法,以及熟悉二叉树的相关操作。
本实验采用C语言进行编写。
二、实验内容(200字)1.二叉树的建立:通过输入节点的值,逐个建立二叉树的节点,并通过指针连接起来。
2.二叉树的遍历:实现二叉树的三种常用遍历算法,即前序遍历、中序遍历和后序遍历。
三、实验过程(400字)1.二叉树的建立:首先,定义二叉树的节点结构,包含节点值和指向左右子树的指针;然后,通过递归的方式,依次输入节点的值,创建二叉树节点,建立好节点之间的连接。
2.二叉树的前序遍历:定义一个函数,实现前序遍历的递归算法,先输出当前节点的值,再递归遍历左子树和右子树。
3.二叉树的中序遍历:同样,定义一个函数,实现中序遍历的递归算法,先递归遍历左子树,再输出当前节点的值,最后递归遍历右子树。
4.二叉树的后序遍历:同样,定义一个函数,实现后序遍历的递归算法,先递归遍历左子树和右子树,再输出当前节点的值。
四、实验结果(300字)通过实验,我成功建立了一个二叉树,并实现了三种遍历算法。
对于建立二叉树来说,只要按照递归的思路,先输入根节点的值,再分别输入左子树和右子树的值,即可依次建立好节点之间的连接。
建立好二叉树后,即可进行遍历操作。
在进行遍历算法的实现时,我首先定义了一个函数来进行递归遍历操作。
在每一次递归调用中,我首先判断当前节点是否为空,若为空则直接返回;若不为空,则按照特定的顺序进行遍历操作。
在前序遍历中,我先输出当前节点的值,再递归遍历左子树和右子树;在中序遍历中,我先递归遍历左子树,再输出当前节点的值,最后递归遍历右子树;在后序遍历中,我先递归遍历左子树和右子树,再输出当前节点的值。
通过运行程序,我成功进行了二叉树的建立和遍历,并得到了正确的结果。
可以看到,通过不同的遍历顺序,可以获得不同的遍历结果,这也是二叉树遍历算法的特性所在。
数据结构课程设计报告——二叉排序树(用顺序表结构存储)

淮阴工学院数据结构课程设计报告选题名称:二叉排序树(二叉链表结构存储)系(院):计算机工程系专业:计算机科学与技术班级:计算机1091姓名:黄磊学号:1091301108指导教师:张亚红周海岩学年学期:2010 ~ 2011 学年第 1 学期2010 年12 月31 日设计任务书摘要:数据结构是研究与数据之间的关系,我们称这一关系为数据的逻辑结构,简称数据结构。
当数据的逻辑结构确定以后,数据在物理空间中的存储方式,称为数据的存储结构。
相同的逻辑结构可以具有不同的存储结构,因而有不同的算法。
本次课程设计,程序中的数据采用“树形结构”作为其数据结构。
而二叉搜索树又是一种特殊的二叉树。
本课程设中的二叉排序树是基于二叉链表作存储结构的,一共要实现五项基本的功能。
它们分别是二叉搜索树的创建、中序遍历、查找结点、删除结点和计算二叉排序树搜索成功时的平均查找长度。
关键词:二叉排序树;中序遍历;搜索结点;删除结点;平均查找长度目录1需求分析 (1)1.1课程设计题目、任务及要求 (1)1.2课程设计思想 (1)2概要设计 (2)2.1 二叉排序树的定义 (2)2.2二叉链表的存储结构 (2)2.3建立二叉排序树 (2)2.4二叉排序树的生成过程 (3)2.5中序遍历二叉树 (3)2.6二叉排序树的查找 (3)2.7二叉排序树的插入 (4)2.8平均查找长度 (4)3详细设计和实现 (4)3.1主要功能模块设计 (4)3.2主程序设计 (5)4调试与操作说明 (12)4.1程序调试 (12)4.2程序操作说明 (12)总结 (16)致谢 (17)参考文献 (18)1需求分析1.1课程设计题目、任务及要求二叉排序树。
用二叉链表作存储结构(1)以(0)为输入结束标志,输入数列L,生成一棵二叉排序树T;(2)对二叉排序树T作中序遍历,输出结果;(3)计算二叉排序树T查找成功的平均查找长度,输出结果;(4)输入元素x,查找二叉排序树T:若存在含x的结点,则删除该结点,并作中序遍历(执行操作2);否则输出信息“无x”;1.2课程设计思想建立二叉排序树采用边查找边插入的方式。
数据结构二叉树遍历实验报告

数据结构二叉树遍历实验报告正文:⒈引言本实验旨在通过实现二叉树的遍历算法,加深对数据结构中二叉树的理解,并验证算法的正确性和效率。
⒉实验设备与环境⑴实验设备:一台配置较高的计算机。
⑵实验环境:编程语言为C++,编译器为GCC。
⒊实验内容⑴前序遍历前序遍历是指先访问根节点,然后依次递归遍历左子树和右子树。
在实验中,我们将实现前序遍历算法,并通过测试样例验证算法的正确性。
⑵中序遍历中序遍历是指先递归遍历左子树,然后访问根节点,最后递归遍历右子树。
我们将实现中序遍历算法,并进行测试。
⑶后序遍历后序遍历是指先递归遍历左子树和右子树,最后访问根节点。
我们将实现后序遍历算法,并进行测试。
⒋实验步骤⑴数据结构设计设计二叉树的数据结构,包括节点定义和树的基本操作(如插入节点、删除节点等)。
⑵前序遍历算法实现根据前序遍历的定义,编写算法实现前序遍历。
⑶中序遍历算法实现根据中序遍历的定义,编写算法实现中序遍历。
⑷后序遍历算法实现根据后序遍历的定义,编写算法实现后序遍历。
⑸实验验证针对设计的算法,编写测试样例并进行运行。
验证算法的正确性和效率。
⒌实验结果与分析⑴前序遍历实验结果列出前序遍历算法在不同测试样例下的输出结果,并进行分析。
⑵中序遍历实验结果列出中序遍历算法在不同测试样例下的输出结果,并进行分析。
⑶后序遍历实验结果列出后序遍历算法在不同测试样例下的输出结果,并进行分析。
⒍结论通过本次实验,我们成功实现了二叉树的各种遍历算法,并进行了验证。
根据实验结果,我们可以得出以下结论:(结论内容根据实际情况进行撰写)⒎附件本文档附带相关实验代码。
⒏法律名词及注释⑴法律名词1:注释:是的缩写,指。
⑵法律名词2:注释:是的缩写,指。
(根据实际情况,在此添加更多的法律名词及其注释)。
数据结构二叉树遍历实验报告[1]简版
![数据结构二叉树遍历实验报告[1]简版](https://img.taocdn.com/s3/m/c3328b25a9114431b90d6c85ec3a87c240288a2f.png)
数据结构二叉树遍历实验报告数据结构二叉树遍历实验报告实验目的本实验旨在通过二叉树的遍历方法,加深对二叉树结构的理解,并掌握其遍历的实现方法。
实验内容实验内容包括以下两个部分:1. 实现二叉树的先序遍历方法;2. 实现二叉树的中序遍历方法。
实验原理和实现方法1. 先序遍历先序遍历即从根节点开始,先输出当前节点的值,然后先序遍历左子树,最后先序遍历右子树。
先序遍历的实现方法有递归和迭代两种。
递归实现递归实现的核心是先输出当前节点的值,并递归调用函数对左子树和右子树进行先序遍历。
以下是递归实现的伪代码示例:```pythondef preOrderTraversal(node):if node is None:returnprint(node.value)preOrderTraversal(node.left)preOrderTraversal(node.right)```迭代实现迭代实现需要借助栈来保存节点的信息。
整体思路是先将根节点入栈,然后循环执行以下步骤:弹出栈顶节点并输出,将栈顶节点的右子节点和左子节点依次入栈。
当栈为空时,遍历结束。
以下是迭代实现的伪代码示例:```pythondef preOrderTraversal(node):if node is None:returnstack = [node]while stack:curr = stack.pop()print(curr.value)if curr.right:stack.append(curr.right)if curr.left:stack.append(curr.left)```2. 中序遍历中序遍历即从根节点开始,先中序遍历左子树,然后输出当前节点的值,最后中序遍历右子树。
中序遍历的实现方法同样有递归和迭代两种。
递归实现递归实现的核心是先中序遍历左子树,并输出当前节点的值,最后递归调用函数对右子树进行中序遍历。
以下是递归实现的伪代码示例:```pythondef inOrderTraversal(node):if node is None:returninOrderTraversal(node.left)print(node.value)inOrderTraversal(node.right)```迭代实现迭代实现同样需要借助栈来保存节点的信息。
数据结构课程设计报告计划二叉树

湖南涉外经济学院课程设计报告课程名称:数据构造报告题目:二叉树的基本操作学生姓名:肖琳桂、康政、张小东、张帆所在学院:信息科学与工程学院专业班级:软工本 1402学生学号: 1 、02、14、08指导教师:李春庭2015 年12月31日课程设计任务书报告题目二叉树的基本操作达成时间 2 周肖琳桂专业软工本学生姓名指导教师李春庭职称讲课老师康政班级1402整体设计要乞降主要功能设计一个程序,实现二叉树的创立以及二叉树的遍历(包含先序遍历、中序遍历、后序遍历和层次遍历),计算并输出二叉树的深度和结点个数,功能要求:1.二叉树以二叉链表储存,结点数据种类采纳字符表示,按二叉树的先序遍历序列创立。
2.用文本编写器编写一个的文件, 包含 3 个以上创立按二叉树的先序遍历序列( 即序列中包含空树节点 ) ,每个序列长度许多于10 个,在运转程序时自动载入,也能够由键盘输入创立二叉树。
|3.菜单功能:创立二叉树(二级菜单说明选择文件中的第几个,输出创立二叉树的深度及结点数,若失败则有相应提示),遍历序列(显示先序,中序,后序和层次遍历结果),结点的孩子信息,退出系统。
工作内容实时间进度安排第 17周:周1--- 周2 :立题、论证方案设计周3--- 周5 :程序设计及程序编码第 18周:周1--- 周3 :程序调试周 4--- 周 5 :查收辩论摘要本课程设计主要说明怎样在C++编程环境下实现二叉树的遍历,遍历方式包括 : 二叉树的先序遍历、中序遍历、后序遍历,层次遍历等四种遍历方式。
同时,此次课程设计还包含了求二叉树深度和结点个数,结点的孩子信息,以及对文件的操作,用文件读取的方式实现对二叉树的成立。
以经过此次课程设计,使学生充足掌握树的基本操作,以及对线性储存构造的理解。
同时,在对树的遍历的操作过程中,相同是运用递归的方式实现遍历,在对树实现层次操作的时候,要求用循环行列的操作方式来实现层次遍历。
此次课程设计对数据构造内容综合性的运用的要求较高。
数据结构二叉树遍历实验报告

问题一:二叉树遍历1.问题描述设输入该二叉树的前序序列为:ABC##DE#G##F##HI##J#K##〔#代表空子树〕请编程完成以下任务:⑴请根据此输入来建立该二叉树,并输出该二叉树的前序、中序和后序序列;⑵按层次遍历的方法来输出该二叉树按层次遍历的序列;⑶求该二叉树的高度。
2. 设计描述〔 1 〕二叉树是一种树形构造,遍历就是要让树中的所有节点被且仅被一次,即按一定规律罗列成一个线性队列。
二叉〔子〕树是一种递归定义的构造,包含三个局部:根结点〔 N〕、左子树〔 L〕、右子树〔 R〕。
根据这三个局部的次序对二叉树的遍历发展分类,总共有 6种遍历方案: NLR 、LNR 、LRN 、NRL 、RNL和 LNR 。
研究二叉树的遍历就是研究这 6种具体的遍历方案,显然根据简单的对称性,左子树和右子树的遍历可互换,即 NLR与 NRL 、LNR与 RNL 、LRN与 RLN ,分别相类似,于是只需研究 NLR 、LNR和 LRN 三种即可,分别称为先序遍历〞、中序遍历〞和后序遍历〞。
采用递归方式就可以容易的实现二叉树的遍历,算法简单且直观。
〔2〕此外,二叉树的层次遍历即按照二叉树的层次构造发展遍历,按照从上到下,同一层从左到右的次序各节点。
遍历算法可以利用队列来实现,开场时将整个树的根节点入队,然后每从队列中删除一个节点并输出该节点的值时,都将它的非空的摆布子树入队,当队列完毕时算法完毕。
〔3〕计算二叉树高度也是利用递归来实现:假设一颗二叉树为空,则它的深度为 0 ,否则深度等于摆布子树的最大深度加一。
3 .源程序1 #include <stdio.h>2 #include <stdlib.h>3 #include <malloc.h>4 #define ElemType char5 struct BTreeNode {6 ElemType data;7 struct BTreeNode* left;8 struct BTreeNode* right;9 };10 void CreateBTree(struct BTreeNode** T)11 {12 char ch;1314 if (ch == '#') *T = NULL;15 else {16 (*T) = malloc(sizeof(struct BTreeNode));17 (*T)->data = ch;18 CreateBTree(&((*T)->left));19 CreateBTree(&((*T)->right));20 }21 }22 void Preorder(struct BTreeNode* T)23 {24 if (T != NULL) {2526 Preorder(T->left);27 Preorder(T->right);28 }29 }30 void Inorder(struct BTreeNode* T)31 {32 if (T != NULL) {33 Inorder(T->left);3435 Inorder(T->right);36 }37 }38 void Postorder(struct BTreeNode* T)39 {40 if (T != NULL) {41 Postorder(T->left);42 Postorder(T->right);4344 }45 }46 void Levelorder(struct BTreeNode* BT)47 {48 struct BTreeNode* p;49 struct BTreeNode* q[30];50 int front=0,rear=0;51 if(BT!=NULL) {52 rear=(rear+1)% 30;53 q[rear]=BT;54 }55 while(front!=rear) {56 front=(front+1)% 30;57 p=q[front];5859 if(p->left!=NULL) {60 rear=(rear+1)% 30;61 q[rear]=p->left;62 }63 if(p->right!=NULL) {64 rear=(rear+1)% 30;65 q[rear]=p->right;66 }67 }68 }69 int getHeight(struct BTreeNode* T)70 {71 int lh,rh;72 if (T == NULL) return 0;73 lh = getHeight(T->left);74 rh = getHeight(T->right);7576 }77 void main(void)78 {79 struct BTreeNode* T;80 CreateBTree(&T);81 前序序列:82 Preorder(T);8384 中序序列:85 Inorder(T);-4.运行结果问题二:哈夫曼编码、译码系统1. 问题描述 对一个ASCII 编码的文本文件中的字符发展哈夫曼编码,生成编码文件; 反过来,可将编码文件译码复原为一个文本文件〔选做〕 。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录一、需求分析 (1)1.主功能模块 (1)2.创建树模块 (1)3.遍历树模块 (1)二、概要设计 (2)1.功能设计 (2)(1)创建二叉树 (2)(2)先序递归遍历 (2)(3)中序递归遍历 (2)(4)后序递归遍历 (2)(5)先序非递归遍历 (2)(6)中序非递归遍历 (3)(7)后序非递归遍历 (3)(8)层序非递归遍历 (3)2.算法流程图 (3)三、详细设计 (11)1.界面设计 (11)2.详细代码分析 (13)(1)主模块 (13)(2)创建树模块 (14)(3)遍历树模块 (15)(4)源程序清单 (15)3.调试分析 (34)(1)调试结果 (34)(2)算法分析 (35)四、心得体会 (36)五、参考文献 (37)一、需求分析在现实世界层次化的数据模型中,数据与数据之间的关系纷繁复杂。
其中很多关系无法使用简单的线性结构表示清楚,比如祖先与后代的关系、整体与部分的关系等。
于是人们借鉴自然界中树的形象创造了一种强大的非线性结构——树。
树形结构的具体形式有很多种,其中最常用的就是二叉树。
而二叉树的多层次遍历遍历则是二叉树的重要内容。
本程序用Microsoft Visual C++ 6.0编写,可以实现对二叉树的多种方式的创建、采用递归和非递归等两种方式先序、中序、后序进行遍历。
1.主功能模块通过合理的界面设计,根据提示信息,使用者可以方便快捷地运行本程序来完成创建、遍历二叉树等操作。
界面美观,人性化,程序智能,安全性高。
2.创建树模块当进入程序运行界面后,根据提示输入需要建立的二叉树,共有三种方法来创建二叉树,即:1:广义表构造法、2:先序和中序构造法、3:中序和后序构造法。
建立完二叉树后自动进入下一个功能模块。
3.遍历树模块实现对该二叉树的先序递归遍历、先序非递归遍历、中序递归遍历、中序非递归遍历、后序递归遍历、后序非递归遍历、层序非递归遍历等方式的遍历操作,并输出各遍历序列。
当对该二叉树进行层序非递归遍历时,直接输出该树的逻辑结构图,以便更直观地显示其层次关系。
二、概要设计1.功能设计(1)创建二叉树利用二叉树模板类,创建二叉树时产生类模板,调用类的构造函数来创建,修改二叉树的结构时,可以调用赋值语句直接把广义表转换成二叉树。
相关类或函数如下:class BinaryTree;BinaryTree();BinaryTree<T>& operator=(const string& str);(2)先序递归遍历若二叉树为空,则空操作;否则(1)访问根结点;(2)先序遍历左子树;(3)先序遍历右子树。
相关函数如下:void PreOrderTraverse(const BinaryTreeNode<T>* p) const;(3)中序递归遍历若二叉树为空,则空操作;否则(1)中序遍历左子树;(2)访问根结点;(3)中序遍历右子树。
相关函数如下:void InOrderTraverse(const BinaryTreeNode<T>* p) const;(4)后序递归遍历若二叉树为空,则空操作;否则(1)后序遍历左子树;(2)后序遍历右子树;(3)访问根结点。
相关函数如下:void PostOrderTraverse(const BinaryTreeNode<T>* p) const;(5)先序非递归遍历若二叉树为空,则空操作;否则引入栈模拟递归工作栈,初始时栈为空。
相关函数如下:void PreOrderTraverse() const;(6)中序非递归遍历若二叉树为空,则空操作;否则引入栈模拟递归工作栈,初始时栈为空。
相关函数如下:void InOrderTraverse() const;(7)后序非递归遍历若二叉树为空,则空操作;否则引入栈和标记模拟递归工作栈,初始时栈为空。
相关函数如下:void PostOrderTraverse() const;(8)层序非递归遍历按照树的层次从左到右访问树的结点,层序遍历用于保存结点的容器是队列。
相关函数如下:void LevelOrderTraverse() const;2.算法流程图图2-1 创建二叉树图2-2 前序递归遍历图2-3 中序递归遍历图2-4 后序递归遍历图2-5 先序非递归遍历图2-6 中序非递归遍历图2-7 后序非递归遍历图2-8 层序非递归遍历三、详细设计1.界面设计图3-1 系统运行主界面图3-2 创建二叉树界面图3-3 某二叉树层序遍历界面2.详细代码分析(1)主模块本模块定义了系统运行主界面的相关内容和相关操作函数,源代码如下:int main(){system("color A9"); //设置屏幕背景和字体颜色cout<<endl<<endl<<endl<<endl<<endl;cout<<string(35,'*')<<"遍历二叉树"<<string(35,'*')<<endl;cout<<string(31,' ')<<"1:创建二叉树"<<endl;cout<<string(31,' ')<<"2:先序遍历(递归)"<<endl;cout<<string(31,' ')<<"3:先序遍历(非递归)"<<endl;cout<<string(31,' ')<<"4:中序遍历(递归)"<<endl;cout<<string(31,' ')<<"5:中序遍历(非递归)"<<endl;cout<<string(31,' ')<<"6:后序遍历(递归)"<<endl;cout<<string(31,' ')<<"7:后序遍历(非递归)"<<endl;cout<<string(31,' ')<<"8:层序遍历(非递归)"<<endl;cout<<string(31,' ')<<"9:重新显示所有菜单"<<endl;cout<<string(31,' ')<<"0:关闭窗口";if(second>=0){cout<<"(剩"<<setw(2)<<second<<"秒)";}cout<<endl<<endl<<string(80,'*'); while(!isdigit(ch)) //合法性判断{center("您的输入有误,请重新输入:",0);ch=getch();cout<<ch<<endl;}BinaryTree<char> t; //构造空二叉树while(1) //菜单操作无限循环{bool mark=1; //设置重新显示所有菜单时的输出标记switch(ch){...}}}本模块包括两个类——二叉树结点类、二叉树类,源代码如下:class BinaryTreeNode{private:T data; //存储该结点的数据BinaryTreeNode<T> *parent; //存储该结点的父指针BinaryTreeNode<T> *left; //存储该结点的左孩子指针BinaryTreeNode<T> *right; //存储该结点的右孩子指针public:BinaryTreeNode();BinaryTreeNode(const T& t);T GetData() const;bool IsLeftChild() const;bool IsRightChild() const;BinaryTreeNode<T>* GetParent() const;BinaryTreeNode<T>* GetLeftChild() const;BinaryTreeNode<T>* GetRightChild() const;BinaryTreeNode<T>* GetLeftBrother() const;BinaryTreeNode<T>* GetRightBrother() const;void Assign(const T& t);void SetParent(BinaryTreeNode<T>* q);void SetLeftChild(BinaryTreeNode<T>* q);void SetRightChild(BinaryTreeNode<T>* q);~BinaryTreeNode();};class BinaryTree{private:BinaryTreeNode<T>* root; //二叉树根节点public:BinaryTree(); //二叉树构造函数声明bool IsEmpty() const; //二叉树判空函数声明BinaryTreeNode<T>* GetRoot() const; //取得根节点函数声明BinaryTree<T>& operator=(const string& str); //二叉树赋值函数声明~BinaryTree(); //二叉树析构函数声明private:void NodeCounter(const BinaryTreeNode<T>* p,int& sum) const; //统计二叉树结点个数函数声明void Destroy(BinaryTreeNode<T>* p); //二叉树级联释放结点内存函数声明int Depth(const BinaryTreeNode<T>* p) const; //计算二叉树深度函数声明};本模块包括了各种遍历二叉树的函数,源代码如下:void LevelOrderTraverse() const; //二叉树的层序遍历(非递归)成员函数声明void PreOrderTraverse() const; //二叉树的先序遍历(非递归)成员函数声明void PreOrderTraverse(const BinaryTreeNode<T>* p) const; //二叉树的先序遍历(递归)成员函数声明void InOrderTraverse() const; //二叉树的中序遍历(非递归)成员函数声明void InOrderTraverse(const BinaryTreeNode<T>* p) const; //二叉树的中序遍历(递归)成员函数声明void PostOrderTraverse() const; //二叉树的后序遍历(非递归)成员函数声明void PostOrderTraverse(const BinaryTreeNode<T>* p) const; //二叉树的后序遍历(非递归)成员函数声明(4)源程序清单BinaryTreeNode.h#include<cassert>#include<string>#include<stack>template<class T>class BinaryTreeNode{private:T data; //存储该结点的数据BinaryTreeNode<T> *parent; //存储该结点的父指针BinaryTreeNode<T> *left; //存储该结点的左孩子指针BinaryTreeNode<T> *right; //存储该结点的右孩子指针public:BinaryTreeNode();BinaryTreeNode(const T& t);T GetData() const;bool IsLeftChild() const;bool IsRightChild() const;BinaryTreeNode<T>* GetParent() const;BinaryTreeNode<T>* GetLeftChild() const;BinaryTreeNode<T>* GetRightChild() const;BinaryTreeNode<T>* GetLeftBrother() const;BinaryTreeNode<T>* GetRightBrother() const;void Assign(const T& t);void SetParent(BinaryTreeNode<T>* q);void SetLeftChild(BinaryTreeNode<T>* q);void SetRightChild(BinaryTreeNode<T>* q);~BinaryTreeNode();};template<class T>BinaryTreeNode<T>::BinaryTreeNode():data(0),parent(NULL),left(NULL),right(NULL){} template<class T>BinaryTreeNode<T>::BinaryTreeNode(constT&t):data(t),parent(NULL),left(NULL),right(NULL){}template<class T>bool BinaryTreeNode<T>::IsLeftChild() const{return (this==this->parent->GetLeftChild());}template<class T>bool BinaryTreeNode<T>::IsRightChild() const{return (this==this->parent->GetRightChild());}template<class T>T BinaryTreeNode<T>::GetData() const{return data;}template<class T>BinaryTreeNode<T>* BinaryTreeNode<T>::GetParent() const{return parent;}template<class T>BinaryTreeNode<T>* BinaryTreeNode<T>::GetLeftChild() const{return left;}template<class T>BinaryTreeNode<T>* BinaryTreeNode<T>::GetRightChild() const{return right;}template<class T>BinaryTreeNode<T>* BinaryTreeNode<T>::GetLeftBrother() const{assert(IsRightChild());return this->parent->GetLeftChild();}template<class T>BinaryTreeNode<T>* BinaryTreeNode<T>::GetRightBrother() const {assert(IsLeftChild());return this->parent->GetRightChild();}template<class T>void BinaryTreeNode<T>::Assign(const T& t){data=t;}template<class T>void BinaryTreeNode<T>::SetParent(BinaryTreeNode<T>* q){parent=q;}template<class T>void BinaryTreeNode<T>::SetLeftChild(BinaryTreeNode<T>* q) {left=q;}template<class T>void BinaryTreeNode<T>::SetRightChild(BinaryTreeNode<T>* q) {right=q;}template<class T>BinaryTreeNode<T>::~BinaryTreeNode(){}BinaryTree.h#include<iostream>#include<cmath>#include<vector>#include<stack>#include<queue>#include"BinaryTreeNode.h" //二叉树结点模板类头文件using namespace std;const int MAX=1024;template<class T>class BinaryTree{private:BinaryTreeNode<T>* root; //二叉树根节点public:BinaryTree(); //二叉树构造函数声明bool IsEmpty() const; //二叉树判空函数声明BinaryTreeNode<T>* GetRoot() const; //取得根节点函数声明BinaryTree<T>& operator=(const string& str); //二叉树赋值函数声明void LevelOrderTraverse() const; //二叉树的层序遍历(非递归)成员函数声明void PreOrderTraverse() const; //二叉树的先序遍历(非递归)成员函数声明void PreOrderTraverse(const BinaryTreeNode<T>* p) const; //二叉树的先序遍历(递归)成员函数声明void InOrderTraverse() const; //二叉树的中序遍历(非递归)成员函数声明void InOrderTraverse(const BinaryTreeNode<T>* p) const; //二叉树的中序遍历(递归)成员函数声明void PostOrderTraverse() const; //二叉树的后序遍历(非递归)成员函数声明void PostOrderTraverse(const BinaryTreeNode<T>* p) const; //二叉树的后序遍历(非递归)成员函数声明~BinaryTree(); //二叉树析构函数声明private:void NodeCounter(const BinaryTreeNode<T>* p,int& sum) const; //统计二叉树结点个数函数声明void Destroy(BinaryTreeNode<T>* p); //二叉树级联释放结点内存函数声明int Depth(const BinaryTreeNode<T>* p) const; //计算二叉树深度函数声明};template<class T>BinaryTree<T>::BinaryTree():root(NULL){} //二叉树构造函数定义template<class T>BinaryTree<T>& BinaryTree<T>::operator=(const string& str) //二叉树赋值函数定义{Destroy(root);root=NULL;BinaryTreeNode<T> *index[MAX];BinaryTreeNode<T> *p=NULL;int top=-1,sum=0,number=0;int mark=1;for(int i=0;i<str.size();i++){char ch=str[i];switch(ch){case '(':{index[++top]=p;mark=1;break;}case ')':{mark=1;top--;break;}case ',':{mark++;break;}default:{p=new BinaryTreeNode<T>(ch);sum++;if(root==NULL){root=p;}else{if(mark==1){index[top]->SetLeftChild(p);}else if(mark==2){index[top]->SetRightChild(p);}}}}}NodeCounter(root,number);if(sum>number){Destroy(root);root=NULL;}return *this;}template<class T>bool BinaryTree<T>::IsEmpty() const //二叉树判空函数定义{return (root==NULL);}template<class T>BinaryTreeNode<T>* BinaryTree<T>::GetRoot() const //取得根节点函数定义{return root;}template<class T>void BinaryTree<T>::LevelOrderTraverse() const //二叉树的层序遍历(非递归)成员函数定义{if(root==NULL){cout<<string(15,' ')<<"二叉树为空,请先创建二叉树!"<<endl;return;}int sum=Depth(root);queue<BinaryTreeNode<T> *> list;list.push(root);BinaryTreeNode<T> *p=new BinaryTreeNode<T>(' ');int number=1;while(number<=pow(2,sum)-1){BinaryTreeNode<T>* temp=list.front();list.pop();int i=floor(log10(number)/log10(2))+1;int j=number+1-pow(2,i-1);if(number==pow(2,i-1)){cout<<string((81-pow(2,sum))/2+pow(2,sum-i)-1,' ');}else{cout<<string(pow(2,sum-i+1)-1,' ');}cout<<temp->GetData();if(floor(log10(number+1)/log10(2))==log10(number+1)/log10(2)){cout<<endl;}number++;if(temp->GetLeftChild()!=NULL){list.push(temp->GetLeftChild());}elselist.push(p);}if(temp->GetRightChild()!=NULL){list.push(temp->GetRightChild());}else{list.push(p);}}delete p;}template<class T>void BinaryTree<T>::PreOrderTraverse(const BinaryTreeNode<T>* p) const //二叉树的先序遍历(递归)成员函数定义{if(root==NULL){cout<<"二叉树为空,请先创建二叉树!";return;}if(p==NULL){return;}cout<<p->GetData();PreOrderTraverse(p->GetLeftChild());PreOrderTraverse(p->GetRightChild());}template<class T>void BinaryTree<T>::PreOrderTraverse() const //二叉树的先序遍历(非递归)成员函数定义{if(root==NULL){cout<<"二叉树为空,请先创建二叉树!";return;}stack<BinaryTreeNode<T> *> list;BinaryTreeNode<T> *p=root;while(!list.empty() || p!=NULL){while(p!=NULL)list.push(p);cout<<p->GetData();p=p->GetLeftChild();}p=list.top();list.pop();p=p->GetRightChild();}}template<class T>void BinaryTree<T>::InOrderTraverse(const BinaryTreeNode<T>* p) const //二叉树的中序遍历(递归)成员函数定义{if(root==NULL){cout<<"二叉树为空,请先创建二叉树!";return;}if(p==NULL){return;}InOrderTraverse(p->GetLeftChild());cout<<p->GetData();InOrderTraverse(p->GetRightChild());}template<class T>void BinaryTree<T>::InOrderTraverse() const //二叉树的中序遍历(非递归)成员函数定义{if(root==NULL){cout<<"二叉树为空,请先创建二叉树!";return;}stack<BinaryTreeNode<T> *> list;BinaryTreeNode<T> *p=root;while(!list.empty() || p!=NULL){while(p!=NULL){list.push(p);p=p->GetLeftChild();}p=list.top();list.pop();cout<<p->GetData();p=p->GetRightChild();}}template<class T>void BinaryTree<T>::PostOrderTraverse(const BinaryTreeNode<T>* p) const //二叉树的后序遍历(递归)成员函数定义{if(root==NULL){cout<<"二叉树为空,请先创建二叉树!";return;}if(p==NULL){return;}PostOrderTraverse(p->GetLeftChild());PostOrderTraverse(p->GetRightChild());cout<<p->GetData();}template<class T>void BinaryTree<T>::PostOrderTraverse() const //二叉树的后序遍历(非递归)成员函数定义{if(root==NULL){cout<<"二叉树为空,请先创建二叉树!";return;}stack<BinaryTreeNode<T> *> list;BinaryTreeNode<T> *p=root;BinaryTreeNode<T> *q;bool flag;while(!list.empty() || p!=NULL){while(p!=NULL){list.push(p);p=p->GetLeftChild();}q=NULL;flag=1;while(flag && !list.empty()){p=list.top();if(p->GetRightChild()==q){cout<<p->GetData();list.pop();q=p;if(list.empty()){p=NULL;}}else{p=p->GetRightChild();flag=0;}}}}template<class T>BinaryTree<T>::~BinaryTree() //二叉树析构函数定义{Destroy(root);}template<class T>void BinaryTree<T>::Destroy(BinaryTreeNode<T>* p) //二叉树级联释放结点内存函数定义{if(p!=NULL){Destroy(p->GetLeftChild());Destroy(p->GetRightChild());delete p;p=NULL;}}template<class T>void BinaryTree<T>::NodeCounter(const BinaryTreeNode<T>* p,int& sum) const //统计二叉树结点个数函数定义{if(p==NULL){return;}sum++;NodeCounter(p->GetLeftChild(),sum);NodeCounter(p->GetRightChild(),sum);}template<class T>int BinaryTree<T>::Depth(const BinaryTreeNode<T>* p) const //计算二叉树深度函数声明{if(p==NULL){return 0;}int h1=Depth(p->GetLeftChild());int h2=Depth(p->GetRightChild());return h1>h2 ? h1+1 : h2+1;}遍历二叉树.cpp#include<iostream>#include<iomanip>#include<string>#include<ctime>#include<conio.h>#include"BinaryTree.h" //二叉树模板类头文件using namespace std;char limittime(int i); //限时输入函数声明void menu(int second=30); //菜单输出函数声明void center(string str,bool e=1); //居中输出函数声明bool Convert1(string s1,string s2,string& str); //先序和中序转换成广义表函数声明bool Convert2(string s1,string s2,string& str); //中序和后序转换成广义表函数声明int main(){system("color A9"); //设置屏幕背景和字体颜色char ch=limittime(15); //调用限时函数while(!isdigit(ch)) //合法性判断{center("您的输入有误,请重新输入:",0);ch=getch();cout<<ch<<endl;}BinaryTree<char> t; //构造空二叉树while(1) //菜单操作无限循环{bool mark=1; //设置重新显示所有菜单时的输出标记switch(ch){case '1':{if(t.GetRoot()!=NULL) //进行是否要覆盖原二叉树判断{center("您要重新创建二叉树吗?");center("(请按回车键继续创建,其他键返回上一级。