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

合集下载

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

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

北京物资学院信息学院实验报告课程名数据结构(C++)实验实验名称二叉树算法的实现实验日期年月日实验报告日期年月日姓名______ ___ 班级_____ _______ 学号___一、实验目的1.掌握二叉树的存储的结构;2. 掌握建立二叉树的算法;3. 掌握对二叉树的遍历算法;4. 掌握二叉搜索树的算法;5. 掌握建立哈夫曼树和哈夫曼编码的算法;二、实验内容基本部分1. 采用广义表形式建立二叉树(参考图5-11(a)和/或图5-13(a));2. 对已建立的二叉树,进行先、中、后序和按层遍历;3. 用广义表形式输出二叉树;4. 【习题5-3】1, 2 (2题选作)【提示:参考递归遍历算法】;特殊二叉树部分1.用插入算法建立一棵二叉搜索树,原始数据为:{30,50,20,40,25,70,54,23,80,92},并中序遍历该树、查找其中的元素;2. 构造一棵叶子结点权值分别为3,5,6,7,9,13,21的哈夫曼树;3. 对2题进行哈夫曼编码。

三、实验地点与环境3.1 实验地点(南实验楼教室)3.2实验环境(所用语言环境)四、实验步骤1.2.3.…五、实验结果与分析5.1 实验结果(原始数据,预期结果和运行结果)序号算法名称(函数名) 所在头文件名原始数据与与功能主函数所在文件名运行结果*1 函数名:功能:头文件:CPP文件:原始数据:运行结果:23* 如果不能按“原始数据”、“运行结果”列出数据则不列,必要时在“分析”部分说明5.2 分析(选择部分算法分析,包括函数参数说明、调试中所遇到的问题和解决方法、中间结果等,必要时给出函数和主函数的关键段落。

所选算法应是:重要的算法、有编程特点的算法等)六、小结(收获与心得)。

数据结构二叉树实验报告

数据结构二叉树实验报告

一 、实验目的和要求(1)掌握树的相关概念,包括树、节点的度、树的度、分支节点、叶子节点、孩子节点、双亲节 点、树的深度、森林等定义。

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

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

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

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

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

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

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

(9)掌握并查集的相关概念和算法。

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

二、实验内容注:二叉树b 为如图7-123所示的一棵二叉树图7-123+实验7.1 编写一个程序algo7-1.cpp,实现二叉树的各种运算,并在此基础上设计一个程序exp7-1.cpp 完成如下功能:(1)输出二叉树b ;(2)输出H 节点的左、右孩子节点值; (3)输出二叉树b 的深度; (4)输出二叉树b 的宽度; (5)输出二叉树b 的节点个数;(6)输出二叉树b 的叶子节点个数。

实验7.2设计一个程序exp7-2.cpp,实现二叉树的先序遍历、中序遍历和后序遍历和非递归算法, 以及层次变量里的算法。

并对图7-123所示的二叉树b 给出求解结果。

b+ACF GIKL+NM+E+HdJD₄B臣1607-1.CPPif(b?-HULL)re3P4+;Qu[rear]-p-b;Qu[rear].1no=1;while(reart=front){Front++;b=Qu[front]-P;lnum-Qu[front].1no;if(b->Ichildt=NULL)rpar+t;Qu[rear]-p=b->1child;Qu[rear].Ino-lnun+1;if(D->rch11d?=NULL)1/根结点指针入队//根结点的层次编号为1 1/队列不为空1/队头出队1/左孩子入队1/右孩子入队redr+t;qu[rear]-p=b->rchild;Qu[rear].1no-lnun*1;}}nax-0;lnun-1;i-1;uhile(i<=rear){n=0;whdle(i<=rear ge Qu[1].1no==1num)n+t;it+;Inun-Qu[i].1n0;if(n>max)nax=n;}return max;田1607-1.CPPreturn max;}elsereturn o;口×int Modes(BTNode *D) //求二叉树D的结点个数int nun1,nun2;if(b==NULL)returng,else if(b->ichild==NULL&D->rchild==NULL)return 1;else{num1-Hodes(b->Ichild);num2=Nodes(b->rchild);return(num1+nun2+1);LeafNodes(BINode *D) //求二叉树p的叶子结点个数int num1,num2;1f(D==NULL)return 0;else if(b->1chi1d==NULLc& b->rch11d==NULL)return 1;else{num1-LeafModes(b->lchild);num2=LeafNodes(b->rchild);return(nun1+nun2);int程序执行结果如下:xCProrn FlslirosfViu l SudiollyPrjecslro7 LJebuglFoj7 ex<1)输出二叉树:A<B<D,E<H<J,K<L,M<,N>>>>),C<F,G<,I>>)<2)'H’结点:左孩子为J石孩子为K(3)二叉树b的深度:7<4)二叉树b的宽度:4(5)二叉树b的结点个数:14(6)二叉树b的叶子结点个数:6<?>释放二叉树bPress any key to continue实验7 . 2程序exp7-2.cpp设计如下:坠eTPT-2.EPP#include<stdio.h》winclude<malloc.h>deFn Masie 00typde chr ElemTyetypede sruct nde{ElemType data;stuc node *lclldstruct node rchild;》BTHode;extern vod reaeBNodeBTNode extrn void DispBTHode(BTNodeuoid ProrderBTNode *b)if(b?-NULL)- 回1 / 数据元素1 / 指向左孩子1 / 指向右孩子*eb car *str)xb1 / 先序遍历的递归算法1 / 访问根结点/ / 递归访问左子树1 7 递归访问右子树/ / 根结点入栈//栈不为空时循环/ / 退栈并访问该结点/ / 右孩子入栈{》v oidprintf(*c“,b->data); Preorder(b->lchild); Pre0rder(b->rchild);Preorder1(BTNode *b)BTNode xSt[Maxsize],*p;int top=-1;if(b!-HULL)top++;St[top]-b;uhle (op>-)p-St[top];top--;printf("%c“,p->data);if(p->rchild?-HULL)A约e程p7-2.CPPprintF(”后序逅历序列:\n");printf(" 递归算法=");Postorder(b);printf("\n");printf(“非递归算法:“);Postorder1(b);printf("\n");序执行结果如下:xCAPrograFleicsoftVisal SudlyrjecsProj 2Debuzlroj72ex"二叉树b:A(B(D,ECH<J,K(L,M<,N)>))),C(F,GC.I>))层次遍历序列:A B C D E F G H I J K L M N先序遍历序列:递归算法:A B D E H J K L M N C F G I非归算法:A B D E H J K L M N C F G I中序遍历序列:递归算法: D B J H L K M N E A F C G I非递归算法:D B J H L K M N E A F C G I后序遍历序列:递归算法: D J L N M K H E B F I G C A非递归算法:D J L N H K H E B F I G C APress any key to continue臼p7-3.CPP15Pp a t h[p a t h l e n]-b->d a t a;//将当前结点放入路径中p a t h l e n t+;/7路任长度培1Al1Path1(b->ichild,patn,pathlen);1/递归扫描左子树Al1Path1(b->rchild,path,pathlen); //递归扫描右子树pathlen-- ; //恢复环境uoid Longpath(BTNode *b,Elemtype path[1,int pathlen,Elemtype longpath[],int elongpatnien) int i;1f(b==NULL){if(pathlen>longpatnlen) //若当前路径更长,将路径保存在1ongpatn中for(i-pathlen-1;i>-8;i--)longpath[i]=path[1];longpathlen-pathlen;elsepath[pathlen]=b->data; pathlen4; //将当前结点放入路径中//路径长度增1iongPath(b->lchild,path₇pathlen,langpath,longpathien);//递归扫描左子树LongPath(b->rchiid,path,pathien,longpath,longpathien);//递归扫描石子树pathlen--; /7饮其环境oid DispLeaf(BTNode xb)- 口凶uoid DispLeaf(BTNode xb)iE(D!=NULL){ if(b->1child--HULL B& b->rchild--HULL)printf("3c“,b->data);elsepispLeaf(b->ichild);DispLeaf(b->rchild);oid nain()8TNodexb;ElenType patn[Maxsize],longpath[Maxsize];int i.longpathien-U;CreateBTNode(b,"A(B(D,E(H(J,K(L,H(,N))))),C(F,G(,I)))");printf("\n二灾树b:");DispBTNode(b);printf("\n\n*);printf(”b的叶子结点:");DispLeaf(b);printf("\n\n");printf("A11Path:");A11Path(b);printf("m");printf("AiiPath1:n");AliPath1(b.path.);printf("");LongPath(b,path,8,longpath,longpathlen);printf(”第一条量长路径长度=d\n”,longpathlen);printf(”"第一茶最长路径:");for(i=longpathlen;i>=0;i--)printf("c",longpatn[1]);printf("\n\n");。

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

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

华科数据结构二叉树实验报告一、实验目的本实验旨在通过实践操作,加深对数据结构中二叉树的理解,掌握二叉树的基本操作和应用。

二、实验内容1. 实现二叉树的创建和初始化。

2. 实现二叉树的插入操作。

3. 实现二叉树的删除操作。

4. 实现二叉树的查找操作。

5. 实现二叉树的遍历操作:前序遍历、中序遍历、后序遍历。

6. 实现二叉树的层次遍历。

7. 实现二叉树的销毁操作。

8. 进行实验测试,并分析实验结果。

三、实验步骤1. 创建二叉树的数据结构,包括节点的定义和指针的初始化。

2. 实现二叉树的创建和初始化函数,根据给定的数据构建二叉树。

3. 实现二叉树的插入操作函数,将新节点插入到二叉树的合适位置。

4. 实现二叉树的删除操作函数,删除指定节点,并保持二叉树的结构完整。

5. 实现二叉树的查找操作函数,根据给定的值查找对应的节点。

6. 实现二叉树的遍历操作函数,包括前序遍历、中序遍历、后序遍历。

7. 实现二叉树的层次遍历函数,按照层次顺序遍历二叉树。

8. 实现二叉树的销毁操作函数,释放二叉树的内存空间。

9. 编写测试程序,对上述函数进行测试,并分析实验结果。

四、实验结果与分析经过测试,实验结果如下:1. 创建和初始化函数能够正确构建二叉树,并初始化节点的值和指针。

2. 插入操作函数能够将新节点插入到二叉树的合适位置,并保持二叉树的结构完整。

3. 删除操作函数能够正确删除指定节点,并保持二叉树的结构完整。

4. 查找操作函数能够根据给定的值找到对应的节点。

5. 遍历操作函数能够按照指定的顺序遍历二叉树,并输出节点的值。

6. 层次遍历函数能够按照层次顺序遍历二叉树,并输出节点的值。

7. 销毁操作函数能够释放二叉树的内存空间,防止内存泄漏。

根据实验结果分析,二叉树的基本操作和应用都能够正常实现,达到了预期的效果。

五、实验总结通过本次实验,我进一步加深了对数据结构中二叉树的理解,并掌握了二叉树的基本操作和应用。

通过实践操作,我更加熟悉了二叉树的创建、插入、删除、查找和遍历等操作,同时也学会了如何进行层次遍历和销毁二叉树。

数据结构实验:二叉树功能的实现-精简

数据结构实验:二叉树功能的实现-精简

实验名称:实验八二叉树使用功能的实现(实验报告)一.实验目的:1. 在实验7的基础上,扩展二叉树的功能,实现二叉树所有节点个数和所有叶子节点个数的统计2、编写测试程序,对二叉树的创建、遍历和统计节点、统计叶子节点功能进行验证分析二.实验内容:1. 实现二叉树所有节点个数和所有叶子节点个数的统计。

2、编写测试程序,对二叉树的创建、遍历和统计节点。

二、实验原理:1.统计二叉树中结点个数二叉树结点的个数= 左子树中所含结点的个数+ 右子树所含结点的个数+ 根结点。

int BiTreeCount(BiTreeLink r){ if(r==NULL) return 0;/*空二叉树的结点个数为0*/elsereturn BiTreeCount(r->left)+BiTreeCount(r->right)+1;}2.求二叉树的深度:二叉树的深度= 左子树的深度> 右子树的深度? 左子树的深度+1 :右子树的深度+1。

int BiTreeDepth(BiTreeLink r){int ld,rd;if(r==NULL) return 0;else{ld=BiTreeDepth(r->left);rd=BiTreeDepth(r->right);return ld>rd ? ld+1 : rd+1;}}2.实验流程:1、编辑主函数;2、通过函数调用完成程序设计;3、运行编译函数,查看结果四.程序代码:1.主程序#include "malloc.h"#include "stdio.h"#define MAXSIZE 100/*二叉链表的存储结构*/typedef char DataType;typedef struct Node{DataType data;struct Node *left;struct Node *right;}BTNode,*PBTNode,*BiTreeLink;/*创建二叉树*/BiTreeLink CreateBiTree(char *nodes,int pos,int num) {PBTNode p;if(nodes[pos]==' ' || pos>num)return NULL;p=(PBTNode)malloc(sizeof(BTNode));if(!p){printf("初始化链表错误!\n");return 0;}p->data=nodes[pos];p->left=CreateBiTree(nodes,2*pos,num);p->right=CreateBiTree(nodes,2*pos+1,num);return p;}/*求二叉树叶子节点的个数*/int LeafCount(BiTreeLink r){if(!r) return 0;else if (!r->left && !r->right )return 1;elsereturn LeafCount(r->left) +LeafCount(r->right); }/*统计二叉树中结点个数*/int BiTreeCount(BiTreeLink r){if(r==NULL) return 0;elsereturn BiTreeCount(r->left)+BiTreeCount(r->right)+1;}int main(int argc, char* argv[]){BiTreeLink root,p;int i;char nodes[]={1,2,3,4,5,6,7,8,9};root=CreateBiTree(nodes,1,10);printf("输入序列:\n");for(i=1;i<10;i++)printf("(%c)",nodes[i-1]);printf("\n二叉树节点个数: %d \n",BiTreeCount(root));printf("\n二叉树叶子结点个数: %d\n",LeafCount(root));return 0; }2.实验结果:结果分析:由实验结果可知,成功的完成了对二叉树的操作,可见能实现乘数的功能实现,实验基本成功。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

数据结构二叉树的实验报告数据结构二叉树的实验报告一、引言数据结构是计算机科学中非常重要的一个领域,它研究如何组织和存储数据以便高效地访问和操作。

二叉树是数据结构中常见且重要的一种,它具有良好的灵活性和高效性,被广泛应用于各种领域。

本实验旨在通过实际操作和观察,深入了解二叉树的特性和应用。

二、实验目的1. 理解二叉树的基本概念和特性;2. 掌握二叉树的创建、遍历和查找等基本操作;3. 通过实验验证二叉树的性能和效果。

三、实验过程1. 二叉树的创建在实验中,我们首先需要创建一个二叉树。

通过输入一系列数据,我们可以按照特定的规则构建一棵二叉树。

例如,可以按照从小到大或从大到小的顺序将数据插入到二叉树中,以保证树的有序性。

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

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

前序遍历是先访问根节点,然后再依次遍历左子树和右子树;中序遍历是先遍历左子树,然后访问根节点,最后再遍历右子树;后序遍历是先遍历左子树,然后遍历右子树,最后访问根节点。

3. 二叉树的查找二叉树的查找是指在二叉树中寻找指定的节点。

常见的查找方式有深度优先搜索和广度优先搜索。

深度优先搜索是从根节点开始,沿着左子树一直向下搜索,直到找到目标节点或者到达叶子节点;广度优先搜索是从根节点开始,逐层遍历二叉树,直到找到目标节点或者遍历完所有节点。

四、实验结果通过实验,我们可以观察到二叉树的特性和性能。

在创建二叉树时,如果按照有序的方式插入数据,可以得到一棵平衡二叉树,其查找效率较高。

而如果按照无序的方式插入数据,可能得到一棵不平衡的二叉树,其查找效率较低。

在遍历二叉树时,不同的遍历方式会得到不同的结果。

前序遍历可以用于复制一棵二叉树,中序遍历可以用于对二叉树进行排序,后序遍历可以用于释放二叉树的内存。

在查找二叉树时,深度优先搜索和广度优先搜索各有优劣。

深度优先搜索在空间复杂度上较低,但可能会陷入死循环;广度优先搜索在时间复杂度上较低,但需要较大的空间开销。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

数据结构实验报告1. 实验目的和内容:掌握二叉树基本操作的实现方法2. 程序分析2.1存储结构链式存储2.程序流程2.3关键算法分析算法一:Create(BiNode<T>* &R,T data[],int i,int n)【1】算法功能:创建二叉树【2】算法基本思想:利用顺序存储结构为输入,采用先建立根结点,再建立左右孩子的方法来递归建立二叉链表的二叉树【3】算法空间时间复杂度分析:O(n)【4】代码逻辑:如果位置小于数组的长度则{ 创建根结点将数组的值赋给刚才创建的结点的数据域创建左子树,如果当前结点位置为i,则左孩子位置为2i创建右子树,如果当前结点位置为i,则右孩子位置为2i+1}否则R为空算法二:CopyTree(BiNode<T>*sR,BiNode<T>* &dR))【1】算法功能:复制构造函数【2】算法基本思想:按照先创建根结点,再递归创建左右子树的方法来实现。

【3】算法空间时间复杂度分析:O(n)【4】代码逻辑:如果源二叉树根结点不为空则{创建根结点调用函数自身,创建左子树调用函数自身,创建右子树}将该函数放在复制构造函数中调用,就可以实现复制构造函数算法三:PreOrder(BiNode<T>*R)【1】算法功能:二叉树的前序遍历【2】算法基本思想:这个代码用的是优化算法,提前让当前结点出栈。

【3】算法空间时间复杂度分析:O(n)【4】代码逻辑(伪代码)如果当前结点为非空,则{访问当前结点当前结点入栈将当前结点的左孩子作为当前结点}如果为空{则栈顶结点出栈则将该结点的右孩子作为当前结点}反复执行这两个过程,直到结点为空并且栈空算法四:InOrder(BiNode<T>*R)【1】算法功能:二叉树的中序遍历【2】算法基本思想:递归【3】算法空间时间复杂度分析:未知【4】代码逻辑:如果R为非空:则调用函数自身遍历左孩子访问该结点再调用自身访问该结点的右孩子算法五:LevelOrder(BiNode<T>*R)【1】算法功能:二叉树的层序遍历【2】算法基本思想:【3】算法空间时间复杂度分析:O(n)【4】代码逻辑(伪代码):如果队列不空{对头元素出队访问该元素若该结点的左孩子为非空,则左孩子入队;若该结点的右孩子为非空,则右孩子入队;}算法六:Count(BiNode<T>*R)【1】算法功能:计算结点的个数【2】算法基本思想:递归【3】算法空间时间复杂度分析:未知【4】代码逻辑:如果R不为空的话{调用函数自身计算左孩子的结点数调用函数自身计算右孩子的结点数}template<class T>int BiTree<T>::Count(BiNode<T>*R){if(R==NULL)return 0;else{int m=Count(R->lchild);int n=Count(R->rchild);return m+n+1;}}算法七:Release(BiNode<T>*R)【1】算法功能:释放动态内存【2】算法基本思想:左右子树全部释放完毕后再释放该结点【3】算法空间时间复杂度分析:未知【4】代码逻辑:调用函数自身,释放左子树调用函数自身,释放右子树释放根结点释放二叉树template<class T>void BiTree<T>::Release(BiNode<T>*R) {if(R!=NULL){Release(R->lchild);Release(R->rchild);delete R;}}template<class T>BiTree<T>::~BiTree(){Release(root);}int main(){BiTree<int> BTree(a,10);BiTree<int>Tree(BTree);BTree.PreOrder(BTree.root);cout<<endl;Tree.PreOrder(Tree.root);cout<<endl;BTree.InOrder(BTree.root);cout<<endl;Tree.InOrder(Tree.root);cout<<endl;BTree.PostOrder(BTree.root);cout<<endl;Tree.PostOrder(Tree.root);cout<<endl;BTree.LevelOrder(BTree.root);cout<<endl;Tree.LevelOrder(Tree.root);cout<<endl;int m=BTree.Count(BTree.root);cout<<m<<endl;return 0;}3.测试数据:int a[10]={1,2,3,4,5};1 2 4 5 31 2 4 5 34 25 1 34 5 2 3 11 2 3 4 554.总结:4.1:这次实验大多用了递归的算法,比较好理解。

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

《数据结构》实验报告题目:_二叉树的实现学号:___ ____姓名:____ ___东南大学成贤学院计算机系实验题目一、实验目的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);//定位指定元素的左孩子,返回其指针。

BinTreeNode<ElemType>* Parent(BinTreeNode<ElemType>*r,ElemType e); //定位指定元素的父结点BinTreeNode<ElemType>* LeftSibling(ElemType e);//定位指定元素的左兄弟int Size(BinTreeNode<ElemType> *r);int Depth(BinTreeNode<ElemType> *r);int Leaf(BinTreeNode<ElemType> *r); //统计并返回叶子结点个数void Clear(BinTreeNode<ElemType> *r);void DisplayTreeeHelp(BinTreeNode<ElemType> *r, int level);// 按树状形式显示以r为根的二叉树,level为层次数,可设根结点的层次数为1public:// 二叉树公共方法声明:BinaryTree( );void CreateBiTree();// 构造二叉树B void InOrder(); // 二叉树的中序遍历void PreOrder(); // 二叉树的先序遍历void PostOrder(); // 二叉树的后序遍历void LevelOrder(); //按层遍历int Locate(ElemType e); //查找元素值为e的结点。

int GetLeft(ElemType e, ElemType &c);//读取指定元素的左孩子int GetParent(ElemType e, ElemType &f);//读取指定元素的父元素int GetLeftSibling(ElemType e, ElemType &s);//读取指定元素的左兄弟int InsertChild(ElemType e,ElemType x,ElemType y);//为指定元素 e 插入左、右孩子int SetElem(ElemType e, ElemType x);//更新指定元素int Size( );int Depth( );int Leaf( ); //统计并返回叶子结点个数virtual ~BinaryTree();// 销毁二叉树void DisplayTree();};函数实现由学生自己完成#endif5. 创建源程序文件main.cpp:文件(File)→新建(new)→在弹出的对话框中选择文件标签(Files)→选中选项:C++ Source File→输入源程序文件名(main)→单击“确定”按钮(OK)。

文件内容如下:#include "binary_tree.h" // 二叉树类int main(void){利用swtich构造菜单,对二叉树操作进行测试。

(初始化,构造二叉树,图形显示,前序,中序,后序遍历结果,求结点个数,二叉树深度,叶子结点树,查找结点,找指定结点的左孩子,双亲,左兄弟,插入新的左、右孩子。

}注意:1.在编程过程中注意及时保存编写内容。

四、实验结果1.的代码2.的代码3.运行结果截图(可以有多张)1、#pragma once#include ””using namespace std;// 二叉树类模板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);//定位指定元素的左孩子,返回其指针。

BinTreeNode<ElemType>* Parent(BinTreeNode<ElemType>*r, ElemType e); //定位指定元素的父结点BinTreeNode<ElemType>* LeftSibling(ElemType e);//定位指定元素的左兄弟int Size(BinTreeNode<ElemType> *r);int Depth(BinTreeNode<ElemType> *r);int Leaf(BinTreeNode<ElemType> *r); //统计并返回叶子结点个数void Clear(BinTreeNode<ElemType> *r);void DisplayTreeeHelp(BinTreeNode<ElemType> *r, int level);// 按树状形式显示以r为根的二叉树,level为层次数,可设根结点的层次数为1int size;public:// 二叉树公共方法声明:BinaryTree(); // 无参数的构造函数模板void CreateBiTree();// 构造二叉树//BinTreeNode<ElemType> *GetRoot(); // 返回二叉树的根void InOrder(); // 二叉树的中序遍历void PreOrder(); // 二叉树的先序遍历void PostOrder(); // 二叉树的后序遍历void LevelOrder(); //按层遍历int Locate(ElemType e); //查找元素值为e的结点。

int GetLeft(ElemType e, ElemType &c);//读取指定元素的左孩子int GetParent(ElemType e, ElemType &f);//读取指定元素的父元素int GetLeftSibling(ElemType e, ElemType &s);//读取指定元素的左兄弟int InsertChild(ElemType e, ElemType x, ElemType y);//为指定元素 e 插入左、右孩子int SetElem(ElemType e, ElemType x);//更新指定元素int Size();int Depth();int Leaf(); //统计并返回叶子结点个数virtual ~BinaryTree();// 销毁二叉树void DisplayTree();};template <class ElemType>void BinaryTree<ElemType>::PreOrderHelp(BinTreeNode<ElemType> *r) // private{if (r != NULL){cout << r->data << " "; // 访问根结点PreOrderHelp(r->leftChild); // 遍历左子树PreOrderHelp(r->rightChild); // 遍历右子树}}template <class ElemType>void BinaryTree<ElemType>::PreOrder() // public{PreOrderHelp(root);}template <class ElemType>void BinaryTree<ElemType>::InOrderHelp(BinTreeNode<ElemType> *r) // private{if (r != NULL){InOrderHelp(r->leftChild); // 遍历左子树cout << r->data << " "; // 访问根结点InOrderHelp(r->rightChild); // 遍历右子树}}template <class ElemType>void BinaryTree<ElemType>::InOrder() // public{InOrderHelp(root);}template <class ElemType>void BinaryTree<ElemType>::PostOrderHelp(BinTreeNode<ElemType> *r) // private{if (r != NULL){PostOrderHelp(r->leftChild); // 遍历左子树PostOrderHelp(r->rightChild); // 遍历右子树cout << r->data << " "; // 访问根结点}}template <class ElemType>void BinaryTree<ElemType>::PostOrder() // public{PostOrderHelp(root);}template <class ElemType>void BinaryTree<ElemType>::LevelOrder(){LinkQueue<BinTreeNode<ElemType> *> q;BinTreeNode<ElemType> *t = root;if (t != NULL) (t); // 如果根非空,则入队while (!()){(t);cout << t->data << " "; //if (t->leftChild != NULL) // 左孩子非空(t->leftChild); // 左孩子入队if (t->rightChild != NULL) // 右孩子非空(t->rightChild); // 右孩子入队}}template <class ElemType>BinaryTree<ElemType>::BinaryTree(){root = NULL;}template <class ElemType>void BinaryTree<ElemType>::CreateBiTree(){BinTreeNode<ElemType>* r;ElemType end, empty, x;cout <<"按先序序列的顺序输入一棵二叉树"<< endl;cout <<"输入的结束标志是:";cin >> end;cout <<"输入的空结点标志是:";cin >> empty;cout <<"请开始输入:"<< endl;cin >> x;r = new BinTreeNode<ElemType>;r->data = x;r->leftChild = r->rightChild = NULL;root = r;Creat(r, 0, empty, end); //创建根结点的左子树Creat(r, 1, empty, end); //创建根结点的右子树}template <class ElemType>void BinaryTree<ElemType>::Creat(BinTreeNode<ElemType> *r,int flag, ElemType empty, ElemType end){BinTreeNode<ElemType> *p; ElemType x;cin >> x;if (x != end&&x != empty){p = new BinTreeNode<ElemType>; p->data = x;p->leftChild = p->rightChild = NULL;if (flag == 0) r->leftChild = p; //p为左子树else r->rightChild = p; //p为右子树size++;Creat(p, 0, empty, end); //递归创建左子树Creat(p, 1, empty, end); //递归创建右子树}}template <class ElemType>BinTreeNode<ElemType>*BinaryTree<ElemType>::GetRoot(){return root;}template <class ElemType>BinTreeNode<ElemType>*BinaryTree<ElemType>::Locate(BinTreeNode<ElemType> *r, ElemType e) //private{if (r == NULL) return NULL;if (r->data == e) return r;BinTreeNode<ElemType> *p = Locate(r->leftChild, e);if (p == NULL) p = Locate(r->rightChild, e);return p;}template <class ElemType>int BinaryTree<ElemType>::Locate(ElemType e) //public{if (Locate(root, e) == NULL)return false;elsereturn true;}template <class ElemType>BinTreeNode<ElemType>*BinaryTree<ElemType>::LeftChild(ElemType e) //private{BinTreeNode<ElemType>* ep = Locate(root, e);if (ep == NULL) return NULL; //找不到结点eif (ep->leftChild == NULL) //e无左孩子return NULL;return ep->leftChild; //返回e左孩子的指针}template <class ElemType>int BinaryTree<ElemType>::GetLeft(ElemType e, ElemType &c) //Public{BinTreeNode<ElemType>* p = LeftChild(e);if (p == NULL) return false; //e无左孩子c = p->data;return true;}template <class ElemType>BinTreeNode<ElemType>* BinaryTree<ElemType>::Parent(BinTreeNode<ElemType>*r, ElemType e) //private{BinTreeNode<ElemType>* p;if (r == NULL)return NULL;if ((r->leftChild != NULL&&r->leftChild->data == e) ||(r->rightChild != NULL&&r->rightChild->data == e))return r; //r是e的父结点,返回结点r的指针p = Parent(r->leftChild, e); //递归调用r的左子树if (p == NULL) p = Parent(r->rightChild, e);return p;}template <class ElemType>int BinaryTree<ElemType>::GetParent(ElemType e, ElemType &f) //public {if (root == NULL || root->data == e)return false;BinTreeNode<ElemType> *p = Parent(root, e);if (p == NULL) return false; //树中无元素ef = p->data;return true;}template <class ElemType>BinTreeNode<ElemType>* BinaryTree<ElemType>::LeftSibling(ElemType e) //private{if (root->data == e) return NULL;BinTreeNode<ElemType> *p = Parent(root, e);if (p == NULL)return NULL; //无e结点if (p->leftChild->data == e) //e是其父亲的左孩子return NULL;return p->leftChild; //返回e的左兄弟指针}template <class ElemType>int BinaryTree<ElemType>::GetLeftSibling(ElemType e, ElemType &s){if (root->data == e)return false; //根结点无兄弟BinTreeNode<ElemType> *p = LeftSibling(e);if (p == NULL)return false; //e无左兄弟s = p->data;return true;}template <class ElemType>int BinaryTree<ElemType>::InsertChild(ElemType e, ElemType x, ElemType y){BinTreeNode<ElemType> *ep, *xp, *yp;ep = Locate(root, e); //定位元素eif (ep == NULL) return false; //找不到元素exp = new BinTreeNode<ElemType>;xp->data = x;xp->rightChild = NULL;yp = new BinTreeNode<ElemType>;yp->data = y;yp->leftChild = NULL;xp->leftChild = ep->leftChild;ep->leftChild = xp; //结点x置为结点e的左孩子yp->rightChild = ep->rightChild;ep->rightChild = yp; //结点y置为结点e的右孩子size = size + 2;return true;}template <class ElemType>int BinaryTree<ElemType>::SetElem(ElemType e, ElemType x){BinTreeNode<ElemType> *p = Locate(root, e);if (p == NULL) return false;p->data = x;return true;}template <class ElemType>int BinaryTree<ElemType>::Size() //public{return Size(root);}template <class ElemType>int BinaryTree<ElemType>::Size(BinTreeNode<ElemType> *r) //private{if (r == NULL) return 0;elsereturn Size(r->leftChild) + Size(r->rightChild) + 1;//二叉树的结点总数为左右子树的结点数之和加1}template <class ElemType>int BinaryTree<ElemType>::Depth() //public{return Depth(root);}template <class ElemType>int BinaryTree<ElemType>::Depth(BinTreeNode<ElemType> *r) //private {if (r == NULL) return 0;else{int leftD, rightD;leftD = Depth(r->leftChild);rightD = Depth(r->rightChild);return 1 + (leftD > rightD ? leftD : rightD); //二叉树的深度为左右子树的深度的最大值加1}}template <class ElemType>int BinaryTree<ElemType>::Leaf() //public{return Leaf(root);}template <class ElemType>int BinaryTree<ElemType>::Leaf(BinTreeNode<ElemType> *r) //private{if (r == NULL)return 0;if (r->leftChild == NULL&&r->rightChild == NULL)return 1;return Leaf(r->leftChild) + Leaf(r->rightChild);//递归遍历左子树和右子树}template <class ElemType>void BinaryTree<ElemType>::Clear(BinTreeNode<ElemType> *r) //private{if (r != NULL){Clear(r->leftChild); //后序递归Clear(r->rightChild);delete r;size--;}}template <class ElemType>BinaryTree<ElemType>:: ~BinaryTree(){Clear(root);root = NULL;}template <class ElemType>void BinaryTree<ElemType>::DisplayTreeeHelp(BinTreeNode<ElemType> *r, int level){if (r != NULL){DisplayTreeeHelp(r->rightChild, level + 1);//显示右子树cout << endl; //显示新行for (int i = 0; i < level - 1; i++)cout <<" "; //确保在第level列显示结点cout << r->data; //显示结点DisplayTreeeHelp(r->leftChild, level + 1);}}template <class ElemType>void BinaryTree<ElemType>::DisplayTree(){DisplayTreeeHelp(root, 1);cout << endl;}#endif2、#pragma once#include""#include""#include""#include<iostream>#include<cstdlib>3、main.cpp#include""using namespace std;int main() {BinaryTree<int> bt;int c = 0;int tmp1,tmp2,tmp3;while (c != 15) {cout << endl <<"1. 创建二叉树";cout << endl <<"2. 中序遍历";cout << endl <<"3. 先序遍历";cout << endl <<"4. 后序遍历";cout << endl <<"5. 按层遍历";cout << endl <<"6. 查找节点";cout << endl <<"7. 读取左孩子"; cout << endl <<"8. 读取父元素"; cout << endl <<"9. 读取左兄弟"; cout << endl <<"10. 插入左右孩子"; cout << endl <<"11. 更新元素"; cout << endl <<"12. 叶子结点个数"; cout << endl <<"13. 图形显示"; cout << endl <<"14. 销毁二叉树"; cout << endl <<"15. 退出";cout << endl <<"选择功能(1~15):"; cin >> c;switch (c){case 1:();break;case 2:();break;case 3:();break;case 4:();break;case 5:();break;case 6:cout <<"输入查找节点:";cin >> tmp1;if ((tmp1)) {cout <<"存在";break;}cout <<"不存在";break;case 7:cout <<"输入元素:";cin >> tmp1;if ((tmp1,tmp2)) {cout <<"左孩子为:"<< tmp2;break;}cout <<"不存在";case 8:cout <<"输入元素:";cin >> tmp1;if ((tmp1,tmp2)) {cout <<"父元素为:"<< tmp2;break;}cout <<"不存在";break;case 9:cout <<"输入元素:";cin >> tmp1;if ((tmp1,tmp2)) {cout <<"左兄弟为:"<< tmp2;break;}cout <<"不存在";break;case 10:cout <<"输入元素:";cin >> tmp1;cout <<"输入左孩子:";cin >> tmp2;cout <<"输入右孩子:";cin >> tmp3;if ((tmp1,tmp2,tmp3)) {cout <<"修改完成" ;break;}cout <<"修改失败";break;case 11:cout <<"输入元素:";cin >> tmp1;cout <<"修改为:";cin >> tmp2;if ((tmp1, tmp2)) {cout <<"修改成功";break;}cout <<"修改失败";break;case 12:cout <<"叶子结点个数:"<< ();break;case 13:();break;case 14:bt.~BinaryTree();cout <<"销毁成功";break;case 15:exit(0);}}return 0;}。

相关文档
最新文档