二叉树实验报告

合集下载

二叉排序树的实验报告

二叉排序树的实验报告

二叉排序树的实验报告二叉排序树的实验报告引言:二叉排序树(Binary Search Tree,简称BST)是一种常用的数据结构,它将数据按照一定的规则组织起来,便于快速的查找、插入和删除操作。

本次实验旨在深入了解二叉排序树的原理和实现,并通过实验验证其性能和效果。

一、实验背景二叉排序树是一种二叉树,其中每个节点的值大于其左子树的所有节点的值,小于其右子树的所有节点的值。

这种特性使得在二叉排序树中进行查找操作时,可以通过比较节点的值来确定查找的方向,从而提高查找效率。

二、实验目的1. 理解二叉排序树的基本原理和性质;2. 掌握二叉排序树的构建、插入和删除操作;3. 验证二叉排序树在查找、插入和删除等操作中的性能和效果。

三、实验过程1. 构建二叉排序树首先,我们需要构建一个空的二叉排序树。

在构建过程中,我们可以选择一个节点作为根节点,并将其他节点插入到树中。

插入节点时,根据节点的值与当前节点的值进行比较,如果小于当前节点的值,则将其插入到当前节点的左子树中;如果大于当前节点的值,则将其插入到当前节点的右子树中。

重复这个过程,直到所有节点都被插入到树中。

2. 插入节点在已有的二叉排序树中插入新的节点时,我们需要遵循一定的规则。

首先,从根节点开始,将新节点的值与当前节点的值进行比较。

如果小于当前节点的值,则将其插入到当前节点的左子树中;如果大于当前节点的值,则将其插入到当前节点的右子树中。

如果新节点的值与当前节点的值相等,则不进行插入操作。

3. 删除节点在二叉排序树中删除节点时,我们需要考虑不同的情况。

如果要删除的节点是叶子节点,即没有左右子树,我们可以直接删除该节点。

如果要删除的节点只有一个子树,我们可以将子树连接到要删除节点的父节点上。

如果要删除的节点有两个子树,我们可以选择将其右子树中的最小节点或左子树中的最大节点替代该节点,并删除相应的替代节点。

四、实验结果通过对二叉排序树的构建、插入和删除操作的实验,我们得到了以下结果:1. 二叉排序树可以高效地进行查找操作。

二叉树的建立和遍历的实验报告doc

二叉树的建立和遍历的实验报告doc

二叉树的建立和遍历的实验报告篇一:二叉树的建立及遍历实验报告实验三:二叉树的建立及遍历【实验目的】(1)掌握利用先序序列建立二叉树的二叉链表的过程。

(2)掌握二叉树的先序、中序和后序遍历算法。

【实验内容】1. 编写程序,实现二叉树的建立,并实现先序、中序和后序遍历。

如:输入先序序列abc###de###,则建立如下图所示的二叉树。

并显示其先序序列为:abcde中序序列为:cbaed后序序列为:cbeda【实验步骤】1.打开VC++。

2.建立工程:点File->New,选Project标签,在列表中选Win32 Console Application,再在右边的框里为工程起好名字,选好路径,点OK->finish。

至此工程建立完毕。

3.创建源文件或头文件:点File->New,选File标签,在列表里选C++ Source File。

给文件起好名字,选好路径,点OK。

至此一个源文件就被添加到了你刚创建的工程之中。

4.写好代码5.编译->链接->调试#include#include#define OK 1#define OVERFLOW -2typedef int Status;typedef char TElemType;typedef struct BiTNode{TElemType data;struct BiTNode *lchild, *rchild;}BiTNode,*BiTree;Status CreateBiTree(BiTree &T){TElemType ch;scanf("%c",&ch);if (ch=='#')T= NULL;else{if (!(T = (BiTNode *)malloc(sizeof(BiTNode))))return OVERFLOW;T->data = ch; CreateBiTree(T->lchild); CreateBiTree(T->rchild); }return OK;} // CreateBiTreevoid PreOrder(BiTree T) {if(T){printf("%c",T->data); PreOrder(T->lchild); PreOrder(T->rchild);}}void InOrder(BiTree T) {if(T){InOrder(T->lchild);printf("%c",T->data);InOrder(T->rchild);}}void PostOrder(BiTree T){if(T){PostOrder(T->lchild); PostOrder(T->rchild);printf("%c",T->data);}}void main(){BiTree T;CreateBiTree(T);printf("\n先序遍历序列:"); PreOrder(T);printf("\n中序遍历序列:"); InOrder(T);printf("\n后序遍历序列:"); PostOrder(T);}【实验心得】这次实验主要是通过先序序列建立二叉树,和二叉树的先序、中序、后续遍历算法。

二叉树的遍历算法实验报告

二叉树的遍历算法实验报告

二叉树的遍历算法实验报告二叉树的遍历算法实验报告引言:二叉树是计算机科学中常用的数据结构之一,它是由节点组成的层次结构,每个节点最多有两个子节点。

在实际应用中,对二叉树进行遍历是一项重要的操作,可以帮助我们理解树的结构和节点之间的关系。

本文将介绍二叉树的三种遍历算法:前序遍历、中序遍历和后序遍历,并通过实验验证其正确性和效率。

一、前序遍历前序遍历是指先访问根节点,然后按照先左后右的顺序遍历左右子树。

具体的实现可以通过递归或者使用栈来实现。

我们以递归方式实现前序遍历算法,并进行实验验证。

实验步骤:1. 创建一个二叉树,并手动构造一些节点和它们之间的关系。

2. 实现前序遍历算法的递归函数,函数的输入为根节点。

3. 在递归函数中,首先访问当前节点,然后递归调用函数遍历左子树,最后递归调用函数遍历右子树。

4. 调用前序遍历函数,输出遍历结果。

实验结果:经过实验,我们得到了正确的前序遍历结果。

这证明了前序遍历算法的正确性。

二、中序遍历中序遍历是指按照先左后根再右的顺序遍历二叉树。

同样,我们可以使用递归或者栈来实现中序遍历算法。

在本实验中,我们选择使用递归方式来实现。

实验步骤:1. 继续使用前面创建的二叉树。

2. 实现中序遍历算法的递归函数,函数的输入为根节点。

3. 在递归函数中,首先递归调用函数遍历左子树,然后访问当前节点,最后递归调用函数遍历右子树。

4. 调用中序遍历函数,输出遍历结果。

实验结果:通过实验,我们得到了正确的中序遍历结果。

这证明了中序遍历算法的正确性。

三、后序遍历后序遍历是指按照先左后右再根的顺序遍历二叉树。

同样,我们可以使用递归或者栈来实现后序遍历算法。

在本实验中,我们选择使用递归方式来实现。

实验步骤:1. 继续使用前面创建的二叉树。

2. 实现后序遍历算法的递归函数,函数的输入为根节点。

3. 在递归函数中,首先递归调用函数遍历左子树,然后递归调用函数遍历右子树,最后访问当前节点。

4. 调用后序遍历函数,输出遍历结果。

二叉树遍历的实习报告

二叉树遍历的实习报告

实习报告实习内容:二叉树遍历实习时间:2023实习单位:某高校计算机实验室一、实习目的本次实习的主要目的是通过实现二叉树的遍历,加深对二叉树数据结构的理解,掌握二叉树的常见操作,提高编程能力。

二、实习内容1. 理解二叉树的基本概念和性质,包括节点之间的关系、树的深度、高度等。

2. 掌握二叉树的存储结构,包括顺序存储和链式存储。

3. 实现二叉树的前序遍历、中序遍历和后序遍历。

4. 通过实际编程,验证二叉树遍历的正确性。

三、实习过程1. 二叉树的基本概念和性质:二叉树是一种非线性的数据结构,每个节点最多有两个子节点。

节点之间的关系包括父子关系、兄弟关系等。

树的深度是指从根节点到最远叶子节点的最长路径上的边数,高度是指从根节点到最远叶子节点的最长路径上的边数加1。

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

顺序存储结构使用数组来实现,每个节点存储在数组的一个位置中,节点之间的父子关系通过数组下标来表示。

链式存储结构使用链表来实现,每个节点包含数据域和两个指针域,分别指向左子节点和右子节点。

3. 二叉树的遍历:二叉树的遍历是指按照一定的顺序访问树中的所有节点。

常见的遍历方式有前序遍历、中序遍历和后序遍历。

前序遍历是指先访问根节点,然后递归遍历左子树,最后递归遍历右子树。

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

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

4. 编程实现:根据二叉树的存储结构和遍历方法,编写C语言程序实现二叉树的前序遍历、中序遍历和后序遍历。

程序中使用递归函数来实现遍历操作,通过建立链式存储结构,验证遍历的正确性。

四、实习心得通过本次实习,我对二叉树的数据结构有了更深入的了解,掌握了二叉树的存储方式和常见操作。

在实现二叉树遍历的过程中,我学会了如何使用递归函数解决问题,提高了编程能力。

同时,通过实际编程验证了二叉树遍历的正确性,增强了对算法理解的信心。

二叉树的各种基本运算的实现实验报告

二叉树的各种基本运算的实现实验报告

二叉树的各种基本运算的实现实验报告
一、实验目的
实验目的为了深入学习二叉树的各种基本运算,通过操作实现二叉树的建立、存储、查找、删除、遍历等各种基本运算操作。

二、实验内容
1、构造一个二叉树。

我们首先用一定的节点来构建一棵二叉树,包括节点的左子节点和右子节点。

2、实现查找二叉树中的节点。

在查找二叉树中的节点时,我们根据二叉树的特点,从根节点开始查找,根据要查找的节点的值与根节点的值的大小的关系,来决定接下来查找的方向,直到找到要查找的节点为止。

3、实现删除二叉树中的节点。

在删除二叉树节点时,我们要做的是找到要删除节点的父节点,然后让父节点的链接指向要删除节点的子节点,有可能要删除节点有一个子节点,有可能有两个极点,有可能没有子节点,我们要根据每种情况进行处理,来保持二叉树的结构不变。

4、对二叉树进行遍历操作。

二叉树的遍历有多种方法,本实验使用的是先序遍历。

首先从根节点出发,根据先序遍历的顺序,先访问左子树,然后再访问右子树,最后访问根节点。

三、实验步骤
1、构建二叉树:
我们用一个数组代表要构建的二叉树,第一项为根节点,第二项和第三项是根节点的子节点。

二叉树的遍历实验报告

二叉树的遍历实验报告

二叉树的遍历实验报告实验报告:二叉树的遍历(先序遍历、中序遍历、后序遍历)一、引言二叉树是一种非常常见的数据结构,在计算机领域有着广泛的应用。

对二叉树进行遍历操作是其中最基本的操作之一、本实验旨在通过对二叉树的先序遍历、中序遍历和后序遍历的实践,加深对二叉树遍历算法的理解和掌握。

二、目的1.掌握二叉树先序遍历的算法原理和实现方法;2.掌握二叉树中序遍历的算法原理和实现方法;3.掌握二叉树后序遍历的算法原理和实现方法;4.使用递归和非递归两种方式实现以上三种遍历算法;5.进行正确性验证和性能评估。

三、方法1.算法原理:1.1先序遍历:先访问根节点,然后递归遍历左子树,再递归遍历右子树;1.2中序遍历:先递归遍历左子树,然后访问根节点,最后递归遍历右子树;1.3后序遍历:先递归遍历左子树,再递归遍历右子树,最后访问根节点。

2.实现方法:2.1递归实现:采用函数递归调用的方式,实现对二叉树的遍历;2.2非递归实现:采用栈的数据结构,模拟递归的过程,实现对二叉树的遍历。

四、实验步骤1.数据结构设计:1.1定义二叉树的节点结构,包括节点值和两个指针(分别指向左子节点和右子节点);1.2定义一个栈结构,用于非递归实现时的辅助存储。

2.先序遍历:2.1递归实现:按照先序遍历的原理,通过递归调用遍历左子树和右子树,再输出根节点;2.2非递归实现:通过栈结构模拟递归的过程,先将根节点入栈,然后循环将栈顶节点弹出并输出,再将其右子节点入栈,最后将左子节点入栈,直到栈为空。

3.中序遍历:3.1递归实现:按照中序遍历的原理,通过递归调用先遍历左子树,再输出根节点,最后遍历右子树;3.2非递归实现:先将根节点入栈,然后循环将左子节点入栈,直到左子节点为空,然后弹出栈顶节点并输出,再将其右子节点入栈,重复以上过程直到栈为空。

4.后序遍历:4.1递归实现:按照后序遍历的原理,通过递归调用先遍历左子树,再遍历右子树,最后输出根节点;4.2非递归实现:通过栈结构模拟递归的过程,先将根节点入栈,然后重复以下步骤直到栈为空。

二叉树 实验报告

二叉树 实验报告

二叉树实验报告二叉树实验报告引言:二叉树是一种常见的数据结构,它由节点和边组成,每个节点最多有两个子节点,分别称为左子节点和右子节点。

在本次实验中,我们将探索二叉树的基本概念、特性以及应用。

一、二叉树的定义与性质1.1 二叉树的定义二叉树是一种递归定义的数据结构,它可以为空,或者由一个根节点和两个二叉树组成,分别称为左子树和右子树。

1.2 二叉树的性质(1)每个节点最多有两个子节点,分别称为左子节点和右子节点。

(2)左子树和右子树也是二叉树。

(3)二叉树的子树之间没有关联性,它们是相互独立的。

二、二叉树的遍历方式2.1 前序遍历前序遍历是指先访问根节点,然后按照先左后右的顺序遍历左子树和右子树。

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

2.3 后序遍历后序遍历是指先遍历左子树,然后遍历右子树,最后访问根节点。

2.4 层次遍历层次遍历是指按照从上到下、从左到右的顺序遍历二叉树的每个节点。

三、二叉树的应用3.1 二叉搜索树二叉搜索树是一种特殊的二叉树,它的每个节点的值大于其左子树的所有节点的值,小于其右子树的所有节点的值。

这种特性使得二叉搜索树可以高效地进行查找、插入和删除操作。

3.2 哈夫曼树哈夫曼树是一种带权路径长度最短的二叉树,它常用于数据压缩中。

哈夫曼树的构建过程是通过贪心算法,将权值较小的节点放在离根节点较远的位置,从而实现最优编码。

3.3 表达式树表达式树是一种用于表示数学表达式的二叉树,它的叶节点是操作数,而非叶节点是操作符。

通过对表达式树的遍历,可以实现对表达式的求值。

结论:通过本次实验,我们对二叉树的定义、性质、遍历方式以及应用有了更深入的了解。

二叉树作为一种重要的数据结构,在计算机科学和算法设计中发挥着重要的作用。

在今后的学习和工作中,我们应该进一步探索二叉树的高级应用,并灵活运用于实际问题的解决中。

二叉树实验报告

二叉树实验报告

二叉树实验报告1. 引言二叉树是一种常用的数据结构,广泛应用于计算机科学和信息技术领域。

本实验旨在通过对二叉树的理解和实现,加深对数据结构与算法的认识和应用能力。

本报告将介绍二叉树的定义、基本操作以及实验过程中的设计和实现。

2. 二叉树的定义二叉树是一个有序树,其每个节点最多有两个子节点。

树的左子节点和右子节点被称为二叉树的左子树和右子树。

3. 二叉树的基本操作3.1 二叉树的创建在实验中,我们通过定义一个二叉树的节点结构来创建一个二叉树。

节点结构包含一个数据域和左右指针,用于指向左右子节点。

创建二叉树的过程可以通过递归或者迭代的方式来完成。

3.2 二叉树的插入和删除二叉树的插入操作是将新节点插入到树中的合适位置。

插入时需要考虑保持二叉树的有序性。

删除操作是将指定节点从树中删除,并保持二叉树的有序性。

在实验中,我们可以使用递归或者循环的方式实现这些操作。

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

常见的遍历方式包括前序遍历、中序遍历和后序遍历。

前序遍历先访问根节点,然后按照左孩子-右孩子的顺序递归遍历左右子树。

中序遍历按照左孩子-根节点-右孩子的顺序递归遍历左右子树。

后序遍历按照左孩子-右孩子-根节点的顺序递归遍历左右子树。

3.4 二叉树的查找查找操作是指在二叉树中查找指定的值。

可以通过递归或者循环的方式实现二叉树的查找操作。

基本思路是从根节点开始,通过比较节点的值和目标值的大小关系,逐步向左子树或者右子树进行查找,直到找到目标节点或者遍历到叶子节点。

4. 实验设计和实现在本实验中,我们设计并实现了一个基于Python语言的二叉树类。

具体实现包括二叉树的创建、插入、删除、遍历和查找操作。

在实验过程中,我们运用了递归和迭代的方法实现了这些操作,并进行了测试和验证。

4.1 二叉树类的设计我们将二叉树的节点设计为一个类,其中包括数据域和左右子节点的指针。

另外,我们设计了一个二叉树类,包含了二叉树的基本操作方法。

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

重庆交通大学综合性设计性实验报告班级:软件开发专业 2010级一班实验项目名称:二叉树实验项目性质:设计性实验实验所属课程:数据结构实验室(中心): 6教指导教师:鲁云平实验完成时间: 2012 年 4 月 29 日一、实验目的主要完成以下功能:1. 建立二叉树2. 计算结点所在的层次3 .统计结点数量和叶结点数量4. 计算二叉树的高度5. 计算结点的度6. 找结点的双亲和子女7. 二叉树的遍历8. 二叉树的输出等等二、实验内容及要求1.二叉树的结点结构,二叉树的存储结构由学生自由选择和设定2.实验完成后上交打印的实验报告,报告内容与前面所给定的实验模板相同3.将实验报告电子版和源代码在网络教学平台提交三、实验设备及软件Visual studio 2010四、设计方案㈠题目(老师给定或学生自定)二叉树的简单应用㈡设计的主要思路通过递归原理实现大部分遍历二叉树功能㈢主要功能1. 建立二叉树2. 计算结点所在的层次3 .统计结点数量和叶结点数量4. 计算二叉树的高度5. 计算结点的度6. 找结点的双亲和子女7. 二叉树的遍历8. 二叉树的输出五、主要代码栈头文件:stack.hclass Stack{public:Stack(int sz=100);~Stack(){delete[]elements;}void Push(const T &x);bool Pop(T &x);bool getTop(T &x);bool IsEmpty()const{return(top==-1)?true:false;}bool IsFull()const{return(top==maxSize-1)?true:false;} private:T *elements;int top;int maxSize;void overflowProcess();};template<class T>Stack<T>::Stack(int sz):top(-1),maxSize(sz){elements=new T[maxSize];assert(elements!=NULL);};template<class T>void Stack<T>::overflowProcess(){T*newArray=new T[maxSize+stackIncreament];if(newArray=NULL){cerr<<"存储分配失败!"<<endl;exit(1);} for(int i=0;i<=top;i++)newArray[i]=elements[i];maxSize=maxSize+stackIncreament;delete []elements;elements=newArray;};template<class T>void Stack<T>::Push(const T &x){if(IsFull()==true)overflowProcess();elements[++top]=x;};template<class T>bool Stack<T>::Pop(T &x){if(IsEmpty()==true)return false;x=elements[top--];return true;};template<class T>bool Stack<T>::getTop(T &x){if(IsEmpty()==true)return false;x=elements[top];return true;};二叉树头文件tree.h#include<iostream>#include"stack.h"#include<stdlib.h>#include<fstream>using namespace std;template<class T>struct BinTreeNode{T data;BinTreeNode<T> *leftChild,*rightChild;BinTreeNode():leftChild(NULL),rightChild(NULL){}BinTreeNode(T x,BinTreeNode<T> *l=NULL,BinTreeNode<T> *r=NULL):data(x),leftChild(l),rightChild(r){}};template<class T>class BinaryTree{public:BinTreeNode<T> *root;//二叉树的根指针BinTreeNode<T> *current;T RefValue;//数据输入停止标志BinaryTree():root(NULL){}//构造函数BinaryTree(T value):RefValue(value),root(NULL){}//构造函数BinaryTree(BinaryTree<T>&s);//复制构造函数~BinaryTree(){destroy(root);}//析构函数bool IsEmpty(){return (root==NULL)?true:false;}//判断二叉树空否BinTreeNode<T> *Parent(BinTreeNode<T> *current)//返回父结点{return(root==NULL || root==current)?NULL:Parent(root,current);}BinTreeNode<T> *LeftChild(BinTreeNode<T> *current)//返回左子女{return(current!=NULL)?current->leftChild:NULL;}BinTreeNode<T> *RightChild(BinTreeNode<T> *current)//返回右子女{return(current!=NULL)?current->rightChild:NULL;}int Height(){return Height(root);}//返回树高度int Size(){return Size(root);}//返回结点数BinTreeNode<T> *getRoot()const{return root;}//取根void preOrder(void( *visit)(BinTreeNode<T> *p))//前序遍历{preOrder(root,visit);}void CreateBinTree_one(ifstream& in,BinTreeNode<T> *& BT);//从文件读入建树void CreateBinTree_two(ifstream& in,BinTreeNode<T> *& subTree);void destroy(BinTreeNode<T> *&subTree);//删除int Height(BinTreeNode<T> *subTree);//返回树高度int Size(BinTreeNode<T> *subTree);//返回结点数void Leaf(BinTreeNode<T> *subTree,int &x);//叶结点数目BinTreeNode<T> *Parent(BinTreeNode<T> *subTree,BinTreeNode<T> *current);//返回父结点void Traverse(BinTreeNode<T> *subTree);//前序遍历输出void degree(BinTreeNode<T> *subTree,char &x);//指定结点的度void level(BinTreeNode<T> *subTree,char &x,int &y);//指定结点的层次void Search(BinTreeNode<T> *subTree,char &x);//前序遍历搜索并查找指定结点的子女结点和父结点void PrintBTree(BinTreeNode<T> *subTree);//以广义表的形式输出void perOrder(BinTreeNode<T>* subTree,void(*visit)(BinTreeNode<T> *p));//前序遍历};template<class T>void BinaryTree<T>::destroy(BinTreeNode<T> *&subTree){if(subTree!=NULL){destroy(subTree->leftChild);destroy(subTree->rightChild);delete subTree;}}template<class T>void BinaryTree<T>::CreateBinTree_one(ifstream& in,BinTreeNode<T> *& BT){Stack<BinTreeNode<char> *>s;BT=NULL;BinTreeNode<char> *p,*t;int k;char ch;in>>ch;while(ch!='#'){switch(ch){case '(':s.Push(p);k=1;break;case ')':s.Pop(t);break;case ',':k=2;break;default: p=new BinTreeNode<T>(ch);if(BT==NULL)BT=p;else if(k==1){s.getTop(t);t->leftChild=p;}else{s.getTop(t);t->rightChild=p;}}in>>ch;}}template<class T>void BinaryTree<T>::CreateBinTree_two(ifstream& in,BinTreeNode<T> *&subTree){subTree=NULL;T item;if(!in.eof()){in>>item;if(item!='#'){subTree=new BinTreeNode<T>(item);if(subTree==NULL){cerr<<"存储分配错!"<<endl;exit(1);}CreateBinTree_two(in,subTree->leftChild);CreateBinTree_two(in,subTree->rightChild);}elsesubTree=NULL;}}template<class T>BinTreeNode<T> *BinaryTree<T>::Parent(BinTreeNode<T> *subTree,BinTreeNode<T> *current){if(subTree==NULL)return NULL;if(subTree->leftChild==current||subTree->rightChild==current)return subTree;BinTreeNode<T> *p;if((p=Parent(subTree->leftChild,current))!=NULL)return p;elsereturn Parent(subTree->rightChild,current);}template<class T>void BinaryTree<T>::Traverse(BinTreeNode<T> *subTree){if(subTree!=NULL){cout<<subTree->data<<" ";Traverse(subTree->leftChild);Traverse(subTree->rightChild);}}template<class T>void BinaryTree<T>::perOrder(BinTreeNode<T> *subTree,void(*visit)(BinTreeNode<T> *p)){if(subTree!=NULL){visit(subTree);PreOrder(subTree->leftChild,visit);PreOrder(subTree->rightChild,visit);}}template<class T>int BinaryTree<T>::Size(BinTreeNode<T> *subTree){if(subTree==NULL)return 0;elsereturn 1+Size(subTree->leftChild)+Size(subTree->rightChild); }template<class T>int BinaryTree<T>::Height(BinTreeNode<T> *subTree){if(subTree==NULL)return 0;else{int i=Height(subTree->leftChild);int j=Height(subTree->rightChild);return (i<j)?j+1:i+1;}}template<class T>void BinaryTree<T>::Leaf(BinTreeNode<T> *subTree,int &x){if(subTree!=NULL){if(subTree->leftChild==NULL&&subTree->rightChild==NULL) x++;Leaf(subTree->leftChild,x);Leaf(subTree->rightChild,x);}}template<class T>void BinaryTree<T>::PrintBTree(BinTreeNode<T> *subTree){if(subTree!=NULL){cout<<subTree->data;if(subTree->leftChild!=NULL||subTree->rightChild!=NULL){cout<<'(';PrintBTree(subTree->leftChild);cout<<',';if(subTree->rightChild!=NULL)PrintBTree(subTree->rightChild);cout<<')';}}}template<class T>void BinaryTree<T>::Search(BinTreeNode<T> *subTree,char &x){if(subTree==NULL)return;if(subTree->data==x){cout<<"此字符没有父结点!"<<endl;if(subTree->leftChild!=NULL)cout<<"此字符的左子女为:"<<subTree->leftChild->data<<" ";elsecout<<"此字符没有左子女!"<<" ";if(subTree->rightChild!=NULL)cout<<"此字符的右子女为:"<<subTree->rightChild->data<<endl;elsecout<<"此字符没有右子女!"<<endl;return;}if(subTree->leftChild!=NULL){if(subTree->leftChild->data==x){if(subTree!=NULL)cout<<"此字符的父结点为:"<<subTree->data<<endl;if(subTree->leftChild->leftChild!=NULL)cout<<"此字符的左子女结点为:"<<subTree->leftChild->leftChild->data<<" ";elsecout<<"此字符没有左子女结点!"<<" ";if(subTree->leftChild->rightChild!=NULL)cout<<"此字符的右子女结点为:"<<subTree->leftChild->rightChild->data<<endl;elsecout<<"此字符没有右子女结点!"<<endl;return;}}if(subTree->rightChild!=NULL){if(subTree->rightChild->data==x){if(subTree!=NULL)cout<<"此字符的父结点为:"<<subTree->data<<endl;if(subTree->rightChild->leftChild!=NULL)cout<<"此字符的左子女结点为:"<<subTree->rightChild->leftChild->data<<" ";elsecout<<"此字符没有左子女结点!"<<" ";if(subTree->rightChild->rightChild!=NULL)cout<<"此字符的右子女结点为:"<<subTree->rightChild->rightChild->data<<endl;elsecout<<"此字符没有右子女结点!"<<endl;return;}}if(subTree!=NULL){Search(subTree->leftChild,x);Search(subTree->rightChild,x);}}template<class T>void BinaryTree<T>::degree(BinTreeNode<T> *subTree,char &x){if(subTree==NULL)return;if(subTree->data==x){if(subTree->leftChild!=NULL&&subTree->rightChild!=NULL) cout<<"此结点的度为:2"<<endl;else if(subTree->leftChild!=NULL||subTree->rightChild!=NULL) cout<<"此结点的度为:1"<<endl;elsecout<<"此结点的度为:0"<<endl;return;}if(subTree!=NULL){degree(subTree->leftChild,x);degree(subTree->rightChild,x);}}template<class T>void BinaryTree<T>::level(BinTreeNode<T> *subTree,char &x,int &y) {if(subTree!=NULL){if(subTree->data==x)cout<<"此结点的层次为:"<<y+1<<endl;if(subTree->data!=x){y++;level(subTree->leftChild,x,y);}if(subTree->data!=x){level(subTree->rightChild,x,y);y--;}}}主函数#include<iostream>#include<stdlib.h>#include<assert.h>#include<fstream>#include"tree.h"using namespace std;class tree{private:BinaryTree<char>Tree;public:void menu();void creat();};void tree::menu(){tree Tr;char p;cout<<"_____________________________________________"<<endl;cout<<"| 是否建立一个二叉树? |"<<endl;cout<<"| 点Y 确认建立,点N 退出|"<<endl;cout<<"---------------------------------------------"<<endl;first:cin>>p;switch(p){case 'y':Tr.creat();break;case 'Y':Tr.creat();break;case 'N':return;break;case 'n':return;break;default:{cout<<"输入无效符号请重新输入:"<<endl; goto first;}break;}}void tree::creat(){tree CJ;int Q;ifstream in;zero:cout<<"___________________"<<endl;cout<<"| 请输入建立方式: |"<<endl;cout<<"| 1.用广义表输入|"<<endl;cout<<"| 2.用遍历输入|"<<endl;cout<<"| 3.返回|"<<endl;cout<<"-------------------"<<endl;first:int i;cin>>i;switch(i){case 1:{in.open("10060116(广义).txt",ios::in);if(!in){cout<<"文件打开失败!!"<<endl;exit(1);}Tree.CreateBinTree_one(in,Tree.root);in.close();cout<<"成功从“100600116(广义).txt”里读取广义表示的二叉树:"<<endl;Fanhui1:cout<<"_________________________________"<<endl;cout<<"| 请输入操作:|"<<endl;cout<<"| 1.计算二叉树的结点个数|"<<endl;cout<<"| 2.计算二叉树的高度|"<<endl;cout<<"| 3.计算二叉树的叶节点数量|"<<endl;cout<<"| 4.遍历输出|"<<endl;cout<<"| 5.二叉树的广义表输出|"<<endl;cout<<"| 6.寻找指定结点的父结点及子女|"<<endl;cout<<"| 7.计算指定结点的层次和度|"<<endl;cout<<"| 8.返回创建页面|"<<endl;cout<<"---------------------------------"<<endl;cin>>Q;switch(Q){case 1:{cout<<"此二叉树的结点个数为:";cout<<Tree.Size(Tree.root);cout<<'\n'<<endl;goto Fanhui1;}break;case 2:{cout<<"此二叉树的高度为:";cout<<Tree.Height(Tree.root);cout<<'\n'<<endl;goto Fanhui1;}break;case 3:{int x=0;cout<<"此二叉树的叶结点数量为:";Tree.Leaf(Tree.root,x);cout<<x<<'\n'<<endl;goto Fanhui1;}break;case 4:{cout<<"此二叉树的遍历输出为:";Tree.Traverse(Tree.root);cout<<'\n'<<endl;goto Fanhui1;}break;case 5:{cout<<"此二叉树的广义表输出为:";Tree.PrintBTree(Tree.root);cout<<'\n'<<endl;goto Fanhui1;}break;case 6:{char x;cout<<"请输入要查找的字符:"<<endl;cin>>x;Tree.Search(Tree.root,x);goto Fanhui1;}break;case 7:{char x;int y=0;cout<<"请输入要查找的字符:"<<endl;cin>>x;Tree.degree(Tree.root,x);Tree.level(Tree.root,x,y);gotoFanhui1;}break;case 8:goto zero;break;default:{cout<<"输入无效字符,请重新输入"<<endl;goto Fanhui1;}break;}}break;case 2:{in.open("10060116(遍历).txt",ios::in);if(!in){cout<<"文件打开失败!!"<<endl;exit(1);}Tree.CreateBinTree_two(in,Tree.root);in.close();cout<<"成功从“100600116(遍历).txt”里读取前序序列遍历表示的二叉树:"<<endl;Fanhui2:cout<<"_________________________________"<<endl;cout<<"| 请输入操作:|"<<endl;cout<<"| 1.计算二叉树的结点个数|"<<endl;cout<<"| 2.计算二叉树的高度|"<<endl;cout<<"| 3.计算二叉树的叶节点数量|"<<endl;cout<<"| 4.遍历输出|"<<endl;cout<<"| 6.寻找指定结点的父结点及子女|"<<endl;cout<<"| 7.计算指定结点的层次和度|"<<endl;cout<<"| 8.返回创建页面|"<<endl;cout<<"---------------------------------"<<endl;cin>>Q;switch(Q){case 1:{cout<<"此二叉树的结点个数为:";cout<<Tree.Size(Tree.root);cout<<'\n'<<endl;goto Fanhui2;}break;case 2:{cout<<"此二叉树的高度为:";cout<<Tree.Height(Tree.root);cout<<'\n'<<endl;goto Fanhui2;}break;case 3:{int x=0;cout<<"此二叉树的叶结点数量为:";Tree.Leaf(Tree.root,x);cout<<x<<'\n'<<endl;goto Fanhui2;}break;case 4:{cout<<"此二叉树的遍历输出为:";Tree.Traverse(Tree.root);cout<<'\n'<<endl;goto Fanhui2;}break;case 5:{cout<<"此二叉树的广义表输出为:";Tree.PrintBTree(Tree.root);cout<<'\n'<<endl;goto Fanhui2;}break;case 6:{char x;cout<<"请输入要查找的字符:"<<endl;cin>>x;Tree.Search(Tree.root,x);goto Fanhui2;}break;case 7:{char x;int y=0;cout<<"请输入要查找的字符:"<<endl;cin>>x;Tree.degree(Tree.root,x);Tree.level(Tree.root,x,y);goto Fanhui2;}break;case 8:goto zero;break;default:{cout<<"输入无效字符,请重新输入"<<endl;goto Fanhui2;}break;}}break;case 3:CJ.menu();break;default:{cout<<"输入无效选项,请重新输入"<<'\n'<<endl;goto first;} }}void main(){tree Tr;Tr.menu();}六、测试结果及说明测试成功,可运行。

相关文档
最新文档