二叉树数据结构课程设计报告

合集下载

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

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

目录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 概要设计通过一个二叉链表对二叉树存储,其中每个结点包括左孩子指针、右孩子指针和双亲结点表示值。

通过一个顺序栈对二叉树先中序遍历的结点存储,其中包括一个下标指针和二叉树结点数组。

通过一个顺序栈对二树后序遍历的结点存储,其中包括一个下标指针和二叉树结点和值的数组。

通过一个顺序队列对二叉树层次遍历的结点存储,其中包括头尾指针和一个结点。

数据结构课程设计(5篇)

数据结构课程设计(5篇)

数据结构课程设计(5篇)第一篇:数据结构课程设计课程设计说明书设计名称:数据结构课程设计题目:设计五:二叉树的相关操作学生姓名:专业:计算机科学与技术班级:学号:指导教师:日期: 2012 年 3 月 5 日课程设计任务书计算机科学与技术专业年级班一、设计题目设计五二叉树的相关操作二、主要内容建立二叉树,并对树进行相关操作。

三、具体要求1)利用完全二叉树的性质建立一棵二叉树。

(层数不小于4层)2)统计树叶子结点的个数。

3)求二叉树的深度。

4)能够输出用前序,中序,后序对二叉树进行遍历的遍历序列。

四、进度安排依照教学计划,课程设计时间为:2周。

本设计要求按照软件工程的基本过程完成设计。

建议将时间分为三个阶段:第一阶段,根据题目要求,确定系统的总体设计方案:即系统包括哪些功能模块,每个模块的实现算法,并画出相应的流程图.同时编写相应的设计文档;第二阶段,根据流程图编写程序代码并调试,再将调试通过的各个子模块进行集成调试;第三阶段,归纳文档资料,按要求填写在《课程设计说明书》上,并参加答辩。

三个阶段时间分配的大概比例是:35: 45: 20。

五、完成后应上交的材料本课程设计要求按照学校有关规范的要求完成,在课程设计完成后需要提交的成果和有关文档资料包括课程设计的说明书,课程设计有关源程序及可运行程序(含运行环境)。

其中课程设计说明书的格式按学校规范(见附件),其内容不能过于简单,必须包括的内容有:1、课程设计的基本思想,系统的总功能和各子模块的功能说明;2、课程设计有关算法的描述,并画出有关算法流程图;3、源程序中核心代码的说明。

4、本课程设计的个人总结,主要包括以下内容:(1)课程设计中遇到的主要问题和解决方法;(2)你的创新和得意之处;(3)设计中存在的不足及改进的设想;(4)本次课程设计的感想和心得体会。

5、源代码要求在关键的位置有注释,增加程序的可读性。

程序结构和变量等命名必须符合有关软件开发的技术规范(参见有关文献)。

数据结构实验报告二二叉树实验

数据结构实验报告二二叉树实验

实验报告课程名称:数据结构
第 1 页共4 页
五、实验总结(包括心得体会、问题回答及实验改进意见,可附页)
这次实验主要是建立二叉树,和二叉树的先序、中序、后续遍历算法。

通过这次实验,我巩固了二叉树这部分知识,从中体会理论知识的重要性。

在做实验之前,要充分的理解本次实验的理论依据,这样才能达到事半功倍的效果。

如果在没有真正理解实验原理之盲目的开始实验,只会浪费时间和精力。

例如进行二叉树的遍历的时候,要先理解各种遍历的特点。

先序遍历是先遍历根节点,再依次先序遍历左右子树。

中序遍历是先中序遍历左子树,再访问根节点,最后中序遍历右子树。

而后序遍历则是先依次后续遍历左右子树,再访问根节点。

掌握了这些,在实验中我们就可以融会贯通,举一反三。

其次要根据不光要懂得代码的原理,还要对题目有深刻的了解,要明白二叉树的画法,在纸上先进行自我演练,对照代码验证自己写的正确性。

第 3 页共4 页
第 4 页共4 页。

二叉树课程设计报告

二叉树课程设计报告

一、设计目标二叉树是形象地说既树中每个节点最多只有两个分支,它是一中重要的数据类型。

可以运用于建立家谱,公司所有的员工的职位图,以及各种事物的分类和各种机构的职位图表。

二叉树是通过建立一个链式存储结构,达到能够实现前序遍历,中序遍历,后序遍历。

以及能够从输入的数据中得知二叉树的叶子结点的个数,二叉树的深度。

在此,二叉树的每一个结点中必须包括:值域,左指针域,右指针域。

二、总体设计1.对程序中定义的核心数据结构及对其说明:typedef struct BiTNode{//创建二叉树char data;struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;在开头定义了二叉树的链式存储结构,此处采用了每个结点中设置三个域,即值域,左指针域和右指针域。

2.模块的划分及其功能:本程序分为:7大模块。

二叉树的建立链式存储结构、前序遍历、求叶子结点的个数计算、中序遍历、后序遍历、深度、主函数。

1、二叉树的建立链式存储结构;首先typedef struct BiTNode:定义二叉树的链式存储结构,此处采用了每个结点中设置三个域,即值域,*lchild:左指针域和rchild:右指针域。

2、二叉树的前序遍历;利用二叉链表作为存储结构的前序遍历:先访问根结点,再依次访问左右子树。

3、二叉树的求叶子结点的个数计算;先分别求得左右子树中各叶子结点的个数,再计算出两者之和即为二叉树的叶子结点数。

4、二叉树的中序遍历;利用二叉链表作为存储结构的中序遍历:先访问左子数,再访问根结点,最后访问右子树。

5、二叉树的后序遍历;利用二叉链表作为存储结构的前序遍历:先访问左右子树,再访问根结点。

6、求二叉树的深度:首先判断二叉树是否为空,若为空则此二叉树的深度为0。

否则,就先别求出左右子树的深度并进行比较,取较大的+1就为二叉树的深度。

7、主函数。

核心算法的设计:二叉树是n个节点的有穷个集合,它或者是空集(n=0),或者同时满足以下两个条件:(1):有且仅有一个称为根的节点;(2):其余节点分为两个互不相交的集合T1,T2,并且T1,T2都是二叉树,分别称为根的左子树和右子树。

数据结构课程设计实验报告二叉树的实现

数据结构课程设计实验报告二叉树的实现

《数据结构》实验报告题目:_二叉树的实现学号:___ ____姓名:____ ___东南大学成贤学院计算机系实验题目一、实验目的1.掌握二叉树的基本操作,理解递归算法。

二、实验内容1.将下图所示二叉树采用二叉链表进行存储,然后进行各种操作测试。

三、实验步骤1.启动:开始菜单→程序→Microsoft Visual Studio 6.0 →2.建立工程:文件(File)→新建(new)→在弹出的对话框中选择工程标签(Project)→选中选项:Win32 Console Application(不能选别的)→输入工程名(Project Name)→选择工程的存放位置(Location)→单击“确定”按钮(OK)→在弹出的对话框中选中选项:An Empty Project→单击“完成”按钮(Finish)→在弹出的对话框中单击“确定”按钮( OK )。

3.创建头文件:文件(File)→新建(new)→在弹出的对话框中选择文件标签(Files)→选中选项:C/C++ Header File→输入头文件名(此处定义为“”)→单击“确定”按钮(OK)。

内容如下:// 二叉树结点类模板template <class ElemType>struct BinTreeNode{// 数据成员:ElemType data; // 数据域BinTreeNode<ElemType> *leftChild; // 左孩子BinTreeNode<ElemType> *rightChild; // 右孩子};4.创建头文件:文件(File)→新建(new)→在弹出的对话框中选择文件标签(Files)→选中选项:C/C++ Header File→输入头文件名(此处定义为“”)→单击“确定”按钮(OK)。

定义了链队的类模板,代码如下:#ifndef __BINNARY_TREE_H__#define __BINNARY_TREE_H__// 二叉树类模板template <class ElemType>class BinaryTree{private:// 二叉树的数据成员:BinTreeNode<ElemType> *root;// 二叉树的私有函数:void PreOrderHelp(BinTreeNode<ElemType> *r); // 先序遍历void InOrderHelp(BinTreeNode<ElemType> *r); // 中序遍历void PostOrderHelp(BinTreeNode<ElemType> *r);// 后序遍历void Creat(BinTreeNode<ElemType> *r,int flag, ElemType empty, ElemType end);//递归创建子树BinTreeNode<ElemType> *GetRoot(); //返回根指针BinTreeNode<ElemType> *Locate(BinTreeNode<ElemType> *r,ElemType e); //查找元素值为e的结点,返回指针.BinTreeNode<ElemType>* LeftChild(ElemType e);//定位指定元素的左孩子,返回其指针。

数据结构课程设计报告-二叉树

数据结构课程设计报告-二叉树

数据结构课程设计报告-二叉树湖南涉外经济学院课程设计报告课程名称:数据结构报告题目:二叉树的基本操作学生姓名:肖琳桂、康政、张小东、张帆所在学院:信息科学与工程学院专业班级:软工本1402学生学号: 144300211、02、14、08 指导教师:李春庭摘要本课程设计主要说明如何在C++编程环境下实现二叉树的遍历,遍历方式包括:二叉树的先序遍历、中序遍历、后序遍历,层次遍历等四种遍历方式。

同时,此次课程设计还包括了求二叉树深度和结点个数,结点的孩子信息,以及对文件的操作,用文件读取的方式实现对二叉树的建立。

以通过此次课程设计,使学生充分掌握树的基本操作,以及对线性存储结构的理解。

同时,在对树的遍历的操作过程中,同样是运用递归的方式实现遍历,在对树实现层次操作的时候,要求用循环队列的操作方式来实现层次遍历。

此次课程设计对数据结构内容综合性的运用的要求较高。

关键词:二叉树,先序遍历,中序遍历,后序遍历,层次遍历,节点,线性存储, 节点的孩子信息目录课程设计任务书.................................... 错误!未定义书签。

一、需求分析 (6)1.问题描述 (6)2.功能要求 (6)二、概要设计 (7)1.总体设计图 (7)2.数据结构设计 (8)3.算法设计 (8)4.主要模块及模块之间的关系 (8)三、详细设计 (8)1.结构体(或类)设计 (8)2. 主要模块实现的流程图 (9)3.算法设计 (10)四、测试运行 (12)1.登录和主界面运行效果图 (12)2.运行说明 (12)3. 运行效果图 (13)五、结论与心得 (15)1.总体评价 (15)2.所做的工作及体会 (15)六、程序附录(源代码) (19)七、参考文献 (30)一、需求分析1.问题描述设计一个二叉树。

二叉树形象地说即树中每个节点最多只有两个分支,它是一种重要的数据类型。

可以运用于建立家谱,公司所有的员工的职位图,以及各种事物的分类和各种机构的职位图表等。

二叉树数据结构课程设计报告

二叉树数据结构课程设计报告

数据结构课程设计报告题目:线索二叉树的应用院(系):计算机工程学院专业:嵌入式系统软件设计方向班级:嵌入式109(1)学生:黄江彬指导教师:寇海洲殷路邱军林孙成富2010年12月目录1.设计目的 (3)2.总体设计 (3)2.1首先创建一个线索二叉树 (3)2.2功能函数的实现 (4)3.调试分析 (7)4.测试结果 (7)5课程设计小结. (10)1.设计目的线索二叉树的应用:创建线索二叉树,实现二叉树的建立,插入,删除,恢复线索的算法。

2.总体设计实现过程和步骤提示:2.1首先创建一个线索二叉树2.1.1功能说明:程序首先显示创建线索二叉树的界面,并等待用户输入命令(见图1-1所示)。

假如用户输入ABCE##F##D##G##,程序将在显示屏上输出运算结果(见图1-2所示)。

图1-1图1-22.1.2创建线索二叉树的程序代码://创建二叉树ABD#GJ##K##E##C#FH##IL### ABCD##E###F#GH##I#J#K## void Creat(Bitree *p) //指向指针的指针{char ch=getchar();if(ch=='#')(*p)=NULL;else{//Bitree k;*p=(Bitreenode *)malloc(sizeof(Bitreenode));(*p)->data=ch;Creat(&(*p)->lchild);Creat(&(*p)->rchild);}//return 1;}2.1.3创建线索二叉树系统菜单实现提示:(1).遇“#”则该结点为空;(2).直接从键盘获取字符串.2.2功能函数的实现2.2.1二叉树的遍历2.2.1.1功能说明:对用户输入的二叉树进行遍历2.2.1.2二叉树的遍历程序代码://先序遍历void First(Bitree p){if(p){printf("%2c",p->data);First(p->lchild);First(p->rchild);}}//中序遍历void Middle(Bitree p){if(p){Middle(p->lchild);printf("%2c",p->data);Middle(p->child);}//后序遍历void Last(Bitree p){if(p){Last(p->lchild);Last(p->rchild);printf("%2c",p->data);}}2.2.1.3遍历二叉树功能实现提示:(1).用户输入二叉树后函数自动对所输入二叉树进行遍历。

数据结构实验报告—二叉树

数据结构实验报告—二叉树

数据结构实验报告—二叉树数据结构实验报告—二叉树引言二叉树是一种常用的数据结构,它由节点和边构成,每个节点最多有两个子节点。

在本次实验中,我们将对二叉树的基本结构和基本操作进行实现和测试,并深入了解它的特性和应用。

实验目的1. 掌握二叉树的基本概念和特性2. 熟练掌握二叉树的基本操作,包括创建、遍历和查找等3. 了解二叉树在实际应用中的使用场景实验内容1. 二叉树的定义和存储结构:我们将首先学习二叉树的定义,并实现二叉树的存储结构,包括节点的定义和节点指针的表示方法。

2. 二叉树的创建和初始化:我们将实现二叉树的创建和初始化操作,以便后续操作和测试使用。

3. 二叉树的遍历:我们将实现二叉树的前序、中序和后序遍历算法,并测试其正确性和效率。

4. 二叉树的查找:我们将实现二叉树的查找操作,包括查找节点和查找最大值、最小值等。

5. 二叉树的应用:我们将探讨二叉树在实际应用中的使用场景,如哈夫曼编码、二叉搜索树等。

二叉树的定义和存储结构二叉树是一种特殊的树形结构,它的每个节点最多有两个子节点。

节点被表示为一个由数据和指向其左右子节点的指针组成的结构。

二叉树可以分为三类:满二叉树、完全二叉树和非完全二叉树。

二叉树可以用链式存储结构或顺序存储结构表示。

- 链式存储结构:采用节点定义和指针表示法,通过将节点起来形成一个树状结构来表示二叉树。

- 顺序存储结构:采用数组存储节点信息,通过计算节点在数组中的位置来进行访问和操作。

二叉树的创建和初始化二叉树的创建和初始化是二叉树操作中的基础部分。

我们可以通过手动输入或读取外部文件中的数据来创建二叉树。

对于链式存储结构,我们需要自定义节点和指针,并通过节点的方式来构建二叉树。

对于顺序存储结构,我们需要定义数组和索引,通过索引计算来定位节点的位置。

一般来说,初始化一个二叉树可以使用以下步骤:1. 创建树根节点,并赋初值。

2. 创建子节点,并到父节点。

3. 重复步骤2,直到创建完整个二叉树。

数据结构二叉排序树课程设计报告

数据结构二叉排序树课程设计报告

课程设计报告——数据结构题目:二叉排序树姓名:学号:专业:班级:指导老师:年月日目录一、课程设计简介 (3)二、原理分析及流程 (3)2.1、原理分析 (3)2.2、流程图 (4)1、main()函数 (4)2、创建 (4)3、插入 (5)4、查找 (6)5、中序遍历输出 (7)三、算法描述 (8)3.1、存储结构 (8)3.2、插入算法 (8)3.3、查找算法 (9)3.4、删除算法 (10)四、小结与体会 (12)五、程序执行过程 (13)5.1、创建二叉排序树并中序输出 (13)5.2、插入并中序输出 (13)5.3、查找 (14)六、程序清单 (14)一、课程设计简介1.1、题目:二叉排序树相关操作1、创建二叉排序树;2、插入给定值;3、查找给定值;4、删除给定值的结点。

1.2、报告要求:1、封面;2、题目与流程图或模块图;3、程序清单和运行结果;4、小结(收获和体会);5、装订成册。

1.3、目的:课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。

提高学生适应实际,实践编程的能力。

二、原理分析及流程2.1、原理分析:根据题目要求,要实现这些功能,就必须创建一个菜单。

这个菜单设置在main()函数里面,然后使用while()...switch()语句进行循环调用相关函数,以达到实现相关功能的目的。

2.2、流程图:1、main()函数:23、插入:4、查找:5、中序遍历输出:三、算法描述3.1、存储结构定义一个链表式的二叉排序树,用链表的方式构造结点,存储二叉排序树中的结点、结点类型和指针类型如下:#include <stdio.h>#define null 0typedef int keytype;typedef struct node{keytype key;struct node *lchild,*rchild;}bstnode,*bstree;3.2、插入算法在二叉排序树中插入一个新节点,首先要查找该节点在二叉排序树中是否已经存在。

数据结构二叉树综合实验报告

数据结构二叉树综合实验报告

数据结构二叉树综合实验报告数据结构二叉树综合实验报告1.引言在计算机科学中,二叉树是一种常见的数据结构,它由节点组成,每个节点最多有两个子节点,分别称为左子节点和右子节点。

二叉树具有广泛的应用场景,如在搜索算法、图形处理和编译器设计中等。

本报告旨在介绍我们进行的二叉树综合实验,包括实验目的、实验过程中的具体步骤和实验结果分析等。

2.实验目的本实验的主要目的是通过设计和实现二叉树的基本操作,加深对二叉树的理解,并掌握二叉树的基本算法和应用。

具体的实验目标包括:- 熟悉二叉树的基本概念和性质;- 掌握二叉树的创建、插入和删除操作;- 实现二叉树的遍历算法,包括前序、中序和后序遍历;- 实现二叉树的搜索功能;- 进行基于二叉树的排序实验。

3.实验步骤3.1 二叉树的创建首先,我们需要创建一个空的二叉树。

通过定义二叉树的节点结构和指针,可以动态地分配内存空间用于创建节点,并建立节点之间的连接关系。

3.2 节点的插入在已有的二叉树中,我们可以向其中插入新的节点。

插入操作通常涉及到比较节点的键值大小,然后根据比较结果决定插入新节点的位置。

3.3 节点的删除除了插入节点,我们也可能需要从二叉树中删除节点。

删除操作通常需要考虑节点的子节点情况,例如,被删除的节点是否有左子节点、右子节点或者同时存在。

3.4 二叉树的遍历二叉树的遍历操作可以按照不同的顺序进行,包括前序(根-左-右)、中序(左-根-右)和后序(左-右-根)遍历。

在实验中,我们需要实现这三种遍历算法,并观察它们的输出结果。

3.5 二叉树的搜索在已有的二叉树中,我们可根据节点的键值进行搜索操作。

通过比较键值,我们可以判断在左子树或右子树中进行进一步的搜索,直至找到目标节点或确定目标节点不存在于二叉树中。

3.6 基于二叉树的排序二叉树可以作为一种排序算法的基础结构。

在实验中,我们可以通过节点的插入操作构建一个包含数据集的二叉树,并通过中序遍历获取有序的数据。

数据结构课程设计报告_遍历二叉树

数据结构课程设计报告_遍历二叉树

数据结构课程设计报告_遍历⼆叉树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, 输出该⼆叉树⾮递归遍历算法的遍历结果, 结果如下:。

排序二叉树的应用-数据结构课程设计报告

排序二叉树的应用-数据结构课程设计报告

数据结构课程设计报告题目: 排序二叉树的应用一、设计任务1、程序在运行时,可以执行有关排序二叉树的操作:如插入一个元素、删除一个元素、查找一个元素、打印一个元素等。

2、用递归算法遍历二叉树。

二、设计分析1 、二叉树是n〔n>=0〕个结点的有限集合,它或为空树〔n=0〕,或由一个根结点和两棵分别称为根的左子树和右子树的互不相交的二叉树组成。

二叉树是一个递归定义。

一棵深度为k且有2k-1个结点的二叉树称为满二叉树。

对满二叉树的结点进行连续编号,约定编号从根结点起,自上而下,自左而右。

2 、二叉树的存储结构1〕顺序存储结构:二叉树可以采用顺序存贮结构,即用一维数组来存放二叉树的数据元素。

它是按照满二叉树的结点层次编号层次来依次存放二叉树中的数据元素。

2〕链式存储结构:设计不同的结点结构可构成不同形式的链式存储在本程序中,采用顺序存储结构,对二叉树进行插人、删除、查找、遍历等操作。

3 、二叉树的建立已知一棵二叉树,共有n个结点,建立的方法如下:1)照完全二叉树的编号方法,对该二叉树进行编号。

2)次输入一个结点的值x和该结点的编号k,动态申请一块空间来存放该结点,空间的地址为p。

3)把p值赋给adr[k]中。

4)如果k=1,转到5;否则,把p的值填入其父结点的指针域中。

p 的父结点地址为adr[k/2],假设k为偶数,则做adr[k/2]->lc=p;假设为奇数,则做adr[k/2]->rc=p。

5)重复2~4,直到全部顶点数据输入完为止。

4 、遍历二叉树,即如何按某条搜索路径寻访树中每个结点,使得每个结点均被访问一次,而且仅被访问一次。

一棵非空二叉树是由根结点〔D〕、左子树〔L〕和右子树〔R〕三个基本部分组成。

要遍历这三个基本部分,可以有六种可能的顺序。

假设限定先左后右,则只有三种情况:先序遍历〔DLR〕、中序遍历〔LDR〕、后序遍历〔LRD〕。

在本程序中,遍历二叉树函数的核心是以一个简单的case语句来实现5 、二叉树的插入操作:这个操作首先生成一个新的结点结构,把数据存入新结点,然后搜索二叉树寻找插入结点的位置,再把新结点连接到二叉树。

二叉排序树(二叉链表结构存储)数据结构课程设计报告

二叉排序树(二叉链表结构存储)数据结构课程设计报告

二叉排序树(二叉链表结构存储)数据结构课程设计报告目录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程序操作说明 (13)总结 (16)致谢 (17)参考文献 (19)1需求分析1.1课程设计题目、任务及要求二叉排序树。

用二叉链表作存储结构(1)以(0)为输入结束标志,输入数列L,生成一棵二叉排序树T;(2)对二叉排序树T作中序遍历,输出结果;(3)计算二叉排序树T查找成功的平均查找长度,输出结果;(4)输入元素x,查找二叉排序树T:若存在含x的结点,则删除该结点,并作中序遍历(执行操作2);否则输出信息“无x”;1.2课程设计思想建立二叉排序树采用边查找边插入的方式。

查找函数采用递归的方式进行查找。

如果查找成功则不应再插入原树,否则返回当前结点的上一个结点。

然后利用插入函数将该元素插入原树。

对二叉排序树进行中序遍历采用递归函数的方式。

在根结点不为空的情况下,先访问左子树,再访问根结点,最后访问右子树。

由于二叉排序树自身的性质,左子树小于根结点,而根结点小于右子树,所以中序遍历的结果是递增的。

计算二插排序树的平均查找长度时,仍采用类似中序遍历的递归方式,用s记录总查找长度,j记录每个结点的查找长度,s置初值为0,采用累加的方式最终得到总查找长度s。

平均查找长度就等于s/i(i为树中结点的总个数)。

删除结点函数,采用边查找边删除的方式。

如果没有查找到,则不对树做任何的修改;如果查找到结点,则分四种情况分别进行讨论:1、该结点左右子树均为空;2、该结点仅左子树为空;3、该结点仅右子树为空;4、该结点左右子树均不为空。

数据结构实验报告二叉树

数据结构实验报告二叉树

数据结构实验报告二叉树二叉树是一种重要的数据结构,广泛应用于计算机科学和算法设计中。

在本次实验中,我们通过实际编程实践,深入理解了二叉树的基本概念、性质和操作。

一、二叉树的定义和基本性质二叉树是一种特殊的树结构,每个节点最多有两个子节点。

它具有以下基本性质:1. 根节点:二叉树的顶部节点称为根节点,它没有父节点。

2. 子节点:每个节点最多有两个子节点,分别称为左子节点和右子节点。

3. 叶节点:没有子节点的节点称为叶节点。

4. 深度:从根节点到某个节点的路径长度称为该节点的深度。

5. 高度:从某个节点到其叶节点的最长路径长度称为该节点的高度。

6. 层次遍历:按照从上到下、从左到右的顺序遍历二叉树的节点。

二、二叉树的实现在本次实验中,我们使用C++语言实现了二叉树的基本操作,包括创建二叉树、插入节点、删除节点、查找节点等。

通过这些操作,我们可以方便地对二叉树进行增删改查。

三、二叉树的遍历二叉树的遍历是指按照某种顺序访问二叉树的所有节点。

常用的遍历方式有三种:前序遍历、中序遍历和后序遍历。

1. 前序遍历:先访问根节点,然后依次递归遍历左子树和右子树。

2. 中序遍历:先递归遍历左子树,然后访问根节点,最后递归遍历右子树。

3. 后序遍历:先递归遍历左子树,然后递归遍历右子树,最后访问根节点。

四、二叉树的应用二叉树在计算机科学和算法设计中有广泛的应用。

以下是一些常见的应用场景:1. 二叉搜索树:二叉搜索树是一种特殊的二叉树,它的左子树的值都小于根节点的值,右子树的值都大于根节点的值。

它可以高效地支持插入、删除和查找操作,常用于有序数据的存储和检索。

2. 堆:堆是一种特殊的二叉树,它的每个节点的值都大于(或小于)其子节点的值。

堆常用于实现优先队列等数据结构。

3. 表达式树:表达式树是一种用二叉树表示数学表达式的方法。

通过对表达式树的遍历,可以实现对数学表达式的计算。

4. 平衡树:平衡树是一种特殊的二叉树,它的左右子树的高度差不超过1。

数据结构-课程设计报告二叉排序树的实现

数据结构-课程设计报告二叉排序树的实现

课程设计课程名称数据构造课程设计题目名称二叉排序树的实现学院应用数学学院专业班级学号学生XX指导教师2013 年12 月26 日1.设计任务1)实现二叉排序树,包括生成、插入,删除;2)对二叉排序树进展先根、中根、和后根非递归遍历;3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上用树的形状表示出来。

4)分别用二叉排序树和数组去存储一个班(50人以上)的成员信息(至少包括学号、XX、成绩3项),比照查找效率,并说明为什么二叉排序树效率高〔或者低〕。

2. 函数模块:2.1.主函数main模块功能1.通过bstree CreatTree()操作建立二叉排序树。

2.在二叉排序树t中通过操作bstree InsertBST(bstree t,intkey,nametype name,double grade)插入一个节点。

3. 从二叉排序树t中通过操作void Delete(bstree &p)删除任意节点。

4. 在二叉排序树t中通过操作bstnode *SearchBST(bstree t,keytype key)查找节点。

5. 在二叉排序树t中通过操作p=SearchBST(t,key)查询,并修改节点信息6. 非递归遍历二叉排序树。

7. 定义函数void pare()对数组和二叉排序树的查找效率进展比拟比拟。

2.2创立二叉排序树CreatTree模块从键盘中输入关键字及记录,并同时调用插入函数并不断进展插入。

最后,返回根节点T。

2.3删除模块:二叉排序树上删除一个阶段相当于删去有序系列中的一个记录,只要在删除某个节点之后依旧保持二叉排序树的性质即可。

假设二叉排序树上删除节点为*p〔指向节点的指针为p〕,其双亲节点为*f〔节点指针为f〕。

假设*p节点为叶子节点,那么即左右均为空树,由于删去叶子节点不破坏整棵树的构造,那么只需修改其双亲节点的指针即可;假设*p节点只有左子树或只有右子树,此时只要令左子树或右子树直接成为其双亲节点*f的左子树即可;假设*p节点的左子树和右子树均不为空,其一可以令*p的左子树为*f的左子树,而*p的右子树为*s的右子树,其二可以令*p的直接前驱〔或直接后继〕替代*p,然后再从二叉排序树中删去它的直接前驱〔或直接后继〕。

二叉树实验报告总结(共10篇)

二叉树实验报告总结(共10篇)

二叉树实验报告总结(共10篇)二叉树实验报告实验报告课程名称算法与数据结构专业学号姓名实验日期算法与数据结构实验报告一、实验目的1.了解二叉树的结构特点及有关概念,掌握二叉树建立的基本算法2.了解二叉树遍历的概念,掌握遍历二叉的算法3.进一步掌握树的结构及非线性特点,递归特点和动态性。

二、实验内容二叉树的实现和运算三、实验要求1.用C++/C完成算法设计和程序设计并上机调试通过。

2.撰写实验报告,提供实验结果和数据。

3.分析算法,并简要给出算法设计小结和心得。

四、算法步骤用户以三元组形式输入二叉树的结点元素及其位置关系,建立二叉树,并打印输出该二叉树。

用户输入选择结点,程序调用BiTNode* Find Node(char tag, BiTNode* node)函数,返回子树的根结点,然后调用BiTreeDepth(BiTree T)函数,求出子树的深度,并输出该值。

3.用户可以选择是否继续执行程序,若继续,则输入1,否则输入0,结束程序。

五、主程序代码:int main(void){BiTree T;TElemType e1;char node; // node为用户选择输入的结点//int b,choose; // b为以选定结点为子树的深度,choose为实现多次选择输入的标志//BiTNode* a; // a为选定结点为子树的根结点//choose=1; // 多次选择的标志,当choose为1时运行程序,为0时结束程序// InitBiTree(T);printf(构造空二叉树后,树空否?%d(1:是0:否), 树的深度=%d\n,BiTreeEmpty(T),BiTreeDepth(T));e1 = Root(T);if(e1 != Nil)#ifdef CHARprintf(二叉树的根为: %c\n,e1);#endif#ifdef INTprintf(二叉树的根为: %d\n,e1);#endifelseprintf(树空,无根\n); //三元组构建二叉树striile(x!=end){AddNode(T, x[0], x[1], x[2]);GetUserWord(x);} //输出树PrintTreeLevel( T );//以三元组形式输入任意二叉树(以大写字母表示结点),求以任意一选定结点为子树的深度。

数据结构树和二叉树实验报告

数据结构树和二叉树实验报告

《数据结构〉课程实验报告实验名称树与二叉树实验序号5实验日期姓名院系班级学号指导教师成绩专业教师评语一、实验目得与要求(1)掌握树得相关概念,包括树、结点得度、树得度、分支结点、叶子结点、儿子结点、双亲结点、树得深度、森林等定义。

(2)掌握树得表示,包括树形表示法、文氏图表示法、凹入表示法与括号表示法等。

(3)掌握二叉树得概念,包括二叉树、满二叉树与完全二叉树得定义。

(4)掌握二叉树得性质。

(5)重点掌握二叉树得存储结构,包括二叉树顺序存储结构与链式存储结构。

(6)重点掌握二叉树得基本运算与各种遍历算法得实现。

(7)掌握线索二叉树得概念与相关算法得实现。

(8)掌握哈夫曼树得定义、哈夫曼树得构造过程与哈夫曼编码产生方法。

(9)掌握并查集得相关概念与算法。

(1 0)灵活掌握运用二叉树这种数据结构解决一些综合应用问题。

二、实验项目摘要1编写一程序,实现二叉树得各种基本运算,并在此基础上设计一个主程序完成如下功能:(1)输出二叉树b;(2)输出H结点得左、右孩子结点值;(3)输出二叉树b得深度;(4)输出二叉树b得宽度;(5)输出二叉树b得结点个数;(6)输出二叉树b得叶子结点个数。

2编写一程序,实现二叉树得先序遍历、中序遍历与后序遍历得各种递归与非递归算法,以及层次遍历得算法。

三、实验预习内容二叉树存储结构,二叉树基本运算(创建二叉树、寻找结点、找孩子结点、求高度、输出二叉树)三、实验结果与分析7-1#incl u d e < s tdio、h>#incl u d e<m a1 l o c、h># d e f in e M axS i z e 100typedef cha r E l emT y p e;ty p ed e f struct n o d e{o ElemTy p e data;。

str u c t n ode * 1 c h i 1 d ;0struct no d e * r chi l d;0}BT N ode;void Cr e a teBTNod e(BTNod e *&b,c h ar *s t r){o B TNod e* S t[M a x S ize] , *p=NULL;o i n t t o p=-1,k,j = 0:ch a r ch;b=N U L L;oo0ch= s tr廿];wh i l e C ch!='\O')叶s wit c h(ch){o ca s e'(':to p ++; St[t o p]=p;k=l;b rea k;。

二叉树实验报告

二叉树实验报告

《数据结构》课程设计报告专业计算机科学与技术班级3班姓名学号指导教师起止时间2012.12~2013.1课程设计:二叉树一、任务描述二叉树的中序、前序、后序的递归、非递归遍历算法,应包含建树的实现。

任务:设计一个程序,实现二叉树的前序、中序、后序的递归遍历运算。

要求:(1)创建二叉树;(2)二叉树的前序、中序、后序的递归遍历运算实现。

二、问题分析1、功能分析分析设计课题的要求,要求编程实现以下功能:(1)二叉树的建立—即创建二叉树;(2)二叉树的遍历—二叉树的前序、中序、后序操作;2、数据对象分析二叉树的遍历:包括前序、中序、后序将二叉树补充到完全二叉树在输入,才能正确创建二叉树三、数据结构设计二叉树的建立和遍历的实现。

有关的定义如下:typedef int Status;typedef char TElemType; //定义二叉树结点值的类型为字符型struct BiTNode {//定义二叉树结点类型栈结点的类型TElemType data; //数据域BiTNode *lchild,*rchild;//指针域};BiTNode *BiTree;四、功能设计(一)主控菜单设计程序运行后,输入提示,如下:“创建二叉树,请按前序序列输入各节点值:”正确输入二叉树后,提示“已成功创建二叉树”(二)程序模块结构由课题要求可将程序划分为以下几个模块(即实现程序功能所需的函数):●创建二叉树的函数void CreateBiTree(BiTree &T);●二叉树的前序遍历函数Status PreOrderTraverse(BiTree T,Status(*Visit)(TElemType));●二叉树的中序遍历函数Status InOrderTraverse(BiTree T,Status(*V isit)(TElemType));●二叉树的后序遍历函数Status PostOrderTraverse(BiTree T,Status(*Visit)(TElemType));●最简单的visit函数Status V isit(TElemType e);(三)函数调用关系其中main()是主函数,它进行菜单驱动。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

广西科技大学课程设计报告课程名称《数据结构》学院计算机科学与通信工程学院专业软件工程班级软件181班学号姓名冯孔丽成绩学期 2019-2020-1 指导教师1课题:.将学生信息以学号为关键字存储在二叉搜索树中,然后按照学号查询和删除指定学生的信息。

2设计要求:(1)从键盘输入学生的学号、姓名、英语和数学成绩,计算每个学生的成绩总分,存储在二叉排序树中。

(2)按照输入的学号查询指定的学生信息,若找到,则输出找到的学生信息,否则输出“查找失败”提示信息。

(3)按照输入的学号删除指定的学生信息,若二叉排序树中存储指定学号的学生信息,则删除此学生信息,否则,输出“删除失败”提示信息。

3 程序设计(1)数据设计:二叉搜索树(2)编码○1Main.javapackage com.gkd;import com.binaryNode.BinaryNode;import com.binaryTree.BinaryTree;import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);BinaryTree binarytree=new BinaryTree();boolean iscontinue=true;while(iscontinue) {printOperate();int userInput=scanner.nextInt();switch(userInput) {case 1:System.out.println("请输入学生的学号:"); int stuNumber = scanner.nextInt();System.out.println("请输入学生的姓名:"); String stuName = scanner.next();System.out.println("请输入学生的数学成绩:");double math=scanner.nextDouble();System.out.println("请输入学生的英语成绩:");double english=scanner.nextDouble(); binarytree.insertNode(stuNumber,stuName,math,english); System.out.println("目前学生人数为:"+binarytree.getNodeAmount());break;case 2:System.out.println("你要删除哪位学生的信息(请输入该学生的学号)");int deleteKey = scanner.nextInt();booleanisDeleteNode=binarytree.removeNode(deleteKey);if (isDeleteNode){System.out.println("成功删除学生信息");}else {System.out.println("删除学生信息失败");}break;case 3:System.out.println("请输入你要查询学生的学号");int key = scanner.nextInt();BinaryNode node=binarytree.find(key); if(node==null){break;}System.out.println(node);break;case 4:System.out.println("您已退出学生信息管理系统退出系统");iscontinue=false;break;case 5:binarytree.traversal();break;default:System.out.println("请输入正确数字!"); break;}}}public static void printOperate(){System.out.println("************************"); System.out.println("* 请输入操作 *"); System.out.println("* 1:存储学生信息 *"); System.out.println("* 2:删除学生信息 *"); System.out.println("* 3:查询学生信息 *"); System.out.println("* 4:退出系统 *"); System.out.println("* 5:查找所有学生信息 *"); System.out.println("************************"); }}○2BinaryTree.javapackage com.binaryTree;import com.binaryNode.BinaryNode;public class BinaryTree{private BinaryNode root;//根节点的引用private int nodeAmount;//二叉树节点数量public BinaryTree() {}private BinaryNode find(int stuNumber,BinaryNode node) {if (node == null) {return null;}if (stuNumber<node.getStuNumber()) {return find(stuNumber,node.getLeftChild()); }else if (stuNumber>node.getStuNumber()) {return find(stuNumber,node.getRightChild()); }else {return node;}}public BinaryNode find(int stuNumber) {return find(stuNumber, root);}public boolean insertNode(int stuNumber,String stuName, double math, double english){if(root==null){root = newBinaryNode(stuNumber,stuName,math,english);root.setParent(null);nodeAmount++;return true;}BinaryNode currentNode = root;//当前节点BinaryNode insertedNode = root;while(currentNode!=null){if(stuNumber==currentNode.getStuNumber()){ System.out.println("已有该学号");return false;}insertedNode = currentNode;if(stuNumber<currentNode.getStuNumber()){currentNode=currentNode.getLeftChild();}else{currentNode=currentNode.getRightChild();}}BinaryNode newNode=newBinaryNode(stuNumber,stuName,math,english);if(stuNumber<insertedNode.getStuNumber()){insertedNode.setLeftChild(newNode);newNode.setParent(insertedNode);}else{insertedNode.setRightChild( newNode);newNode.setParent(insertedNode);}nodeAmount++;return true;}public boolean removeNode(int stuNumber){BinaryNode node = find(stuNumber);if(node==null){System.out.println("你未成功删除该学生的信息,没有该学生");return false;}if(node.getStuNumber()==root.getStuNumber()){ if(node.getLeftChild() == null && node.getRightChild()== null){root = null;nodeAmount--;return true;}if(node.getLeftChild()!=null &&node.getRightChild()!=null){BinaryNode minNode = findMin(node.getRightChild()); minNode.getParent().setLeftChild(minNode.getRightChild());if (minNode.getRightChild()!=null){minNode.getRightChild().setParent(minNode.getParent()); }minNode.setLeftChild(node.getLeftChild());node.getLeftChild().setParent(minNode);minNode.setRightChild(node.getRightChild());node.getRightChild().setParent(minNode); root = minNode;nodeAmount--;return true;}if (node.getLeftChild()!=null) {root = node.getLeftChild();}else{root = node.getRightChild();}nodeAmount--;return true;}BinaryNode nodeParent =node.getParent(); if(node.getLeftChild()==null&& node.getRightChild()==null){if(node.getStuNumber()<nodeParent.getStuNumber()){nodeParent.setLeftChild(null);}else{nodeParent.setRightChild(null);}nodeAmount--;return true;}if(node.getLeftChild()!=null &&node.getRightChild()!=null){BinaryNode minNode =findMin(node.getRightChild());if(node.getRightChild()==minNode) {minNode.setLeftChild(node.getLeftChild());node.getLeftChild().setParent(minNode); }else{minNode.getParent().setLeftChild(minNode.getRightChild( ));if(minNode.getRightChild()!=null) {minNode.getRightChild().setParent(minNode.getParent()); }minNode.setLeftChild(node.getLeftChild());node.getLeftChild().setParent(minNode); minNode.setRightChild(node.getRightChild());node.getRightChild().setParent(minNode);}if(node.getStuNumber()<nodeParent.getStuNumber()){nodeParent.setLeftChild(minNode);minNode.setParent(nodeParent);}else{nodeParent.setRightChild(minNode);minNode.setParent(nodeParent);}nodeAmount--;return true;}if (node.getLeftChild()!=null) {BinaryNode nodeChild = node.getLeftChild();if(node.getStuNumber()<nodeParent.getStuNumber()){ nodeParent.setLeftChild(nodeChild);nodeChild.setParent(nodeParent);}else{nodeParent.setRightChild(nodeChild);nodeChild.setParent(nodeParent);}}else{BinaryNode nodeChild =node.getRightChild();if(node.getStuNumber()<nodeParent.getStuNumber()){nodeParent.setLeftChild(nodeChild);nodeChild.setParent(nodeParent);}else{nodeParent.setRightChild(nodeChild);nodeChild.setParent(nodeParent);}}System.out.println("你已成功删除该学生的信息");nodeAmount--;return true;}private BinaryNode findMin(BinaryNode Node) {while(Node.getLeftChild() != null) {Node = Node.getLeftChild();}return Node;}public void traversal() {System.out.println("查找所有学生信息:");inOrderTraversal(root);}public void inOrderTraversal(BinaryNode root) { if(root == null) {return ;}System.out.println(root);inOrderTraversal(root.getLeftChild());inOrderTraversal(root.getRightChild());}public int getNodeAmount() {return nodeAmount;}}○3BinaryNode.javapackage com.binaryNode;public class BinaryNode{private double math;//数学成绩private double english;//英语成绩private double totalPoints;private int stuNumber;//学号private String stuName;//姓名private BinaryNode leftChild;private BinaryNode rightChild;private BinaryNode parent;public BinaryNode() {}public BinaryNode(int stuNumber, String stuName,double math, double english) {this.stuNumber = stuNumber;this.stuName = stuName;this.math = math;this.english = english;this.totalPoints = math+english;}public double getMath() {return math;}public void setMath(double math) {this.math = math;}public double getEnglish() {return english;}public void setEnglish(double english) {this.english = english;}public double getTotalPoints() {return totalPoints;}public void setTotalPoints(double totalPoints) { this.totalPoints = totalPoints;}public int getStuNumber() {return stuNumber;}public void setStuNumber(int stuNumber) {this.stuNumber = stuNumber;}public String getStuName() {return stuName;}public void setStuName(String stuName) {this.stuName = stuName;}public BinaryNode getLeftChild() {return leftChild;}public void setLeftChild(BinaryNode leftChild) {this.leftChild = leftChild;}public BinaryNode getRightChild() {return rightChild;}public void setRightChild(BinaryNode rightChild) { this.rightChild = rightChild;}public BinaryNode getParent() {return parent;}public void setParent(BinaryNode parent) {this.parent = parent;}@Overridepublic String toString() {return"[学号=" + stuNumber +", 姓名=" + stuName +",数学分数=" + math +", 英语分数=" + english +", 总分=" + totalPoints +']';}}(3)测试①插入功能模块的数据输入及结果(可以用程序运行结果的截图)②删除功能模块的数据输入及结果。

相关文档
最新文档