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

合集下载

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

数据结构树和二叉树实验报告
实验题目
树和二叉树
小组合作

姓名
班级
学 号
一、实验目的
(1)掌握树的相关概念,包括树、结点的度、树的度、分支结点、叶子结点、儿子结点、双亲结点、树的深度、森林等定义。
(2)掌握二叉树的概念,包括二叉树、满二叉树和完全二叉树的定义。
(3)掌握哈夫曼树的定义、哈夫曼树的构造过程和哈夫曼编码产生方法。
二.实验环境
return 0;
}
假设二叉树采用二叉树链式存储结构,设计一个算法输出从根结点到每个叶子结点的路径之逆(因为树中路径是从根结点到其他结点的结点序列,就是求叶子结点及其双亲结点、该双亲结点的双亲结点,直到根结点的序列,或者说求叶子结点及其所有祖先结点的序列)。要求采用后根遍历非递归算法。
#include "stdafx.h"
AllPath1(b);
return 0;
}
设计一个算法将二叉树的顺序存储结构转换成二叉链式存储结构。
#include "stdafx.h"
#include "exam7-14.cpp"
int main(int argc, char* argv[])
{
int i,n=10;
BTNode *b;
SqBTree a;
#include "exam7-12.cpp"
int main(int argc, char* argv[])
{
BTNode *b;
CreateBTNode(b,"A(B(D(,G)),C(E,F))");
printf("b:");DispBTNode(b);printf("\n");

数据结构实验报告 二叉树

数据结构实验报告 二叉树

数据结构实验报告二叉树数据结构实验报告:二叉树引言:数据结构是计算机科学中的重要基础,它为我们提供了存储和组织数据的方式。

二叉树作为一种常见的数据结构,广泛应用于各个领域。

本次实验旨在通过实践,深入理解二叉树的概念、性质和操作。

一、二叉树的定义与性质1.1 定义二叉树是一种特殊的树结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。

二叉树可以为空树,也可以是由根节点和左右子树组成的非空树。

1.2 基本性质(1)每个节点最多有两个子节点;(2)左子树和右子树是有顺序的,不能颠倒;(3)二叉树的子树仍然是二叉树。

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

在实际应用中,前序遍历常用于复制一颗二叉树或创建二叉树的副本。

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

中序遍历的结果是一个有序序列,因此在二叉搜索树中特别有用。

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

后序遍历常用于计算二叉树的表达式或释放二叉树的内存。

三、二叉树的实现与应用3.1 二叉树的存储结构二叉树的存储可以使用链式存储或顺序存储。

链式存储使用节点指针连接各个节点,而顺序存储则使用数组来表示二叉树。

3.2 二叉树的应用(1)二叉搜索树:二叉搜索树是一种特殊的二叉树,它的左子树上的节点都小于根节点,右子树上的节点都大于根节点。

二叉搜索树常用于实现查找、插入和删除等操作。

(2)堆:堆是一种特殊的二叉树,它满足堆序性质。

堆常用于实现优先队列,如操作系统中的进程调度。

(3)哈夫曼树:哈夫曼树是一种带权路径最短的二叉树,常用于数据压缩和编码。

四、实验结果与总结通过本次实验,我成功实现了二叉树的基本操作,包括创建二叉树、遍历二叉树和查找节点等。

在实践中,我进一步理解了二叉树的定义、性质和应用。

二叉树作为一种重要的数据结构,在计算机科学中有着广泛的应用,对于提高算法效率和解决实际问题具有重要意义。

数据结构实验三实验报告

数据结构实验三实验报告

数据结构实验三实验报告数据结构实验三实验报告一、实验目的本次实验的目的是通过实践掌握树的基本操作和应用。

具体来说,我们需要实现一个树的数据结构,并对其进行插入、删除、查找等操作,同时还需要实现树的遍历算法,包括先序、中序和后序遍历。

二、实验原理树是一种非线性的数据结构,由结点和边组成。

树的每个结点都可以有多个子结点,但是每个结点只有一个父结点,除了根结点外。

树的基本操作包括插入、删除和查找。

在本次实验中,我们采用二叉树作为实现树的数据结构。

二叉树是一种特殊的树,每个结点最多只有两个子结点。

根据二叉树的特点,我们可以使用递归的方式实现树的插入、删除和查找操作。

三、实验过程1. 实现树的数据结构首先,我们需要定义树的结点类,包括结点值、左子结点和右子结点。

然后,我们可以定义树的类,包括根结点和相应的操作方法,如插入、删除和查找。

2. 实现插入操作插入操作是将一个新的结点添加到树中的过程。

我们可以通过递归的方式实现插入操作。

具体来说,如果要插入的值小于当前结点的值,则将其插入到左子树中;如果要插入的值大于当前结点的值,则将其插入到右子树中。

如果当前结点为空,则将新的结点作为当前结点。

3. 实现删除操作删除操作是将指定的结点从树中移除的过程。

我们同样可以通过递归的方式实现删除操作。

具体来说,如果要删除的值小于当前结点的值,则在左子树中继续查找;如果要删除的值大于当前结点的值,则在右子树中继续查找。

如果要删除的值等于当前结点的值,则有三种情况:- 当前结点没有子结点:直接将当前结点置为空。

- 当前结点只有一个子结点:将当前结点的子结点替代当前结点。

- 当前结点有两个子结点:找到当前结点右子树中的最小值,将其替代当前结点,并在右子树中删除该最小值。

4. 实现查找操作查找操作是在树中寻找指定值的过程。

同样可以通过递归的方式实现查找操作。

具体来说,如果要查找的值小于当前结点的值,则在左子树中继续查找;如果要查找的值大于当前结点的值,则在右子树中继续查找。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

树和二叉树的建立和遍历-数据结构试验报告

树和二叉树的建立和遍历-数据结构试验报告

实验报告一:预习要求预习树和二叉树的存储结构、以递归为基本思想的相应遍历操作。

二:实验目的1、通过实验,掌握二叉树的建立与存储方法。

2、掌握二叉树的结构特性,以及各种存储结构的特点和适用范围。

3、掌握用指针类型描述、访问和处理二叉树的运算。

4、理解huffman编解码的算法三:实验内容以括号表示法输入一棵二叉树,编写算法建立二叉树的二叉链表结构;编写先序、中序、后序、层次遍历二叉树的算法;编写算法计算二叉树的结点数,叶子结点数,以及二叉树的深度。

四:实验原理及试验方法ADT BinaryTree{数据对象:D:D是具有相同特征的数据元素的集合数据结构:R:若D= 空集,则R=空集,称BinaryTree为空二叉树;若D不等于空集,则R={H},H是如下二元关系:(1)在D中存在唯一的称为根的数据元素root,它在关系H下无前驱;(2)若D-{root}不等于空集,则存在D-{root}={D1,Dr},且D1∩Dr=空集;(3)若D1不等于空集,则D1中存在唯一的元素x1,<root,x1>∈H,且存在D1上的关系H1包含于H;若Dr≠空集,则Dr中存在唯一的元素xr,<root,xr>∈H,且存在Dr上的关系Hr包含于H;H={<root,x1>,<root,xr>,H1,Hr};(4) (D1,{H1})是一颗符合本定义的二叉树,称为根的左子树,(Dr,{Hr})是一颗符合本定义的二叉树,称为根的右子树。

基本操作P:CreateBiTree(&T,definition);初始条件:definition给出二叉树的定义。

操作结果:按definition构造二叉树T。

PreOrderTraverse(T);初始条件:二叉树T存在。

操作结果:先序遍历T 。

InOrderTraverse(T);初始条件:二叉树T存在。

操作结果:中序遍历T。

PostOrderTraverse(T);初始条件:二叉树T存在。

树及其应用实验报告(3篇)

树及其应用实验报告(3篇)

第1篇一、实验目的本次实验旨在让学生掌握树的基本概念、数据结构及其应用,包括二叉树、树型结构、哈夫曼树等。

通过实验,加深对数据结构理论知识的理解,提高编程能力和实际应用能力。

二、实验环境1. 操作系统:Windows 102. 编程语言:Python3. 开发工具:PyCharm三、实验内容1. 实现二叉树2. 中序先序序列构造二叉树3. 决策树4. 表达式树5. 实现二叉查找树6. 红黑树源码分析7. 哈夫曼树及其应用四、实验步骤及结果1. 实现二叉树实现二叉树的基本操作,包括创建节点、插入节点、删除节点、查找节点、遍历等。

```pythonclass TreeNode:def __init__(self, value):self.value = valueself.left = Noneself.right = Nonedef insert_node(root, value):if root is None:return TreeNode(value)if value < root.value:root.left = insert_node(root.left, value) else:root.right = insert_node(root.right, value) return rootdef inorder_traversal(root):if root:inorder_traversal(root.left)print(root.value, end=' ')inorder_traversal(root.right)创建二叉树并插入节点root = Nonevalues = [8, 3, 10, 1, 6, 14, 4, 7, 13]for value in values:root = insert_node(root, value)中序遍历二叉树print("中序遍历结果:")inorder_traversal(root)```2. 中序先序序列构造二叉树根据给定的中序和先序序列构造二叉树。

树和二叉树的实验报告

树和二叉树的实验报告

《数据结构》实验报告题目: 树和二叉树一、用二叉树来表示代数表达式(一)需求分析输入一个正确的代数表达式, 包括数字和用字母表示的数, 运算符号+ - * / ^ =及括号。

系统根据输入的表达式建立二叉树, 按照先括号里面的后括号外面的, 先乘后除的原则, 每个节点里放一个数字或一个字母或一个操作符, 括号不放在节点里。

分别先序遍历, 中序遍历, 后序遍历此二叉树, 并输出表达式的前缀式, 中缀式和后缀式。

(二)系统设计1.本程序中用到的所有抽象数据类型的定义;typedef struct BiNode //二叉树的存储类型{char s[20];struct BiNode *lchild,*rchild;}BiTNode,*BiTree;2.主程序的流程以及各程序模块之间的层次调用关系, 函数的调用关系图:3. 列出各个功能模块的主要功能及输入输出参数void push(char cc)初始条件: 输入表达式中的某个符号操作结果: 将输入的字符存入buf数组中去BiTree Create_RTree()初始条件: 给出二叉树的定义表达式操作结果:构造二叉树的右子树, 即存储表达式等号右侧的字符组BiTree Create_RootTree()初始条件: 给出二叉树的定义表达式操作结果:构造存储输入表达式的二叉树, 其中左子树存储‘X’, 根节点存储‘:=’void PreOrderTraverse(BiTree T)初始条件: 二叉树T存在操作结果:先序遍历T, 对每个节点调用函数Visit一次且仅一次void InOrderTraverse(BiTree T)初始条件: 二叉树T存在操作结果:中序遍历T, 对每个节点调用函数Visit一次且仅一次void PostOrderTraverse(BiTree T)初始条件: 二叉树T存在操作结果:后序遍历T, 对每个节点调用函数Visit一次且仅一次int main()主函数, 调用各方法, 操作成功后返回0(三)调试分析调试过程中还是出现了一些拼写错误, 经检查后都能及时修正。

树和二叉树的实验报告

树和二叉树的实验报告

树和二叉树的实验报告树和二叉树的实验报告一、引言树和二叉树是计算机科学中常用的数据结构,它们在各种算法和应用中都有广泛的应用。

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

二、树的构建与遍历1. 树的概念和特性树是一种非线性的数据结构,由节点和边组成。

每个节点可以有零个或多个子节点,其中一个节点没有父节点的称为根节点。

树的特点包括层次结构、唯一根节点和无环等。

2. 树的构建在本实验中,我们使用Python语言构建了一棵树。

通过定义节点类和树类,我们可以方便地创建树的实例,并添加节点和连接节点之间的边。

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

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

我们在实验中实现了这三种遍历方式,并观察了它们的输出结果。

三、二叉树的实现与应用1. 二叉树的概念和特性二叉树是一种特殊的树,每个节点最多有两个子节点,分别称为左子节点和右子节点。

二叉树的特点包括唯一根节点、每个节点最多有两个子节点和子节点的顺序等。

2. 二叉树的实现我们使用Python语言实现了二叉树的数据结构。

通过定义节点类和二叉树类,我们可以创建二叉树的实例,并实现插入节点、删除节点和查找节点等操作。

3. 二叉树的应用二叉树在实际应用中有很多用途。

例如,二叉搜索树可以用于实现快速查找和排序算法。

AVL树和红黑树等平衡二叉树可以用于高效地插入和删除操作。

我们在实验中实现了这些应用,并通过实际操作验证了它们的效果。

四、实验结果与讨论通过实验,我们成功构建了树和二叉树的数据结构,并实现了它们的基本操作。

通过观察和分析实验结果,我们发现树和二叉树在各种算法和应用中的重要性和灵活性。

树和二叉树的特性使得它们适用于解决各种问题,例如搜索、排序、图算法等。

同时,我们也发现了一些问题和挑战,例如树的平衡性和节点的插入和删除操作等。

这些问题需要进一步的研究和优化。

五、总结本实验通过实际操作和观察,深入了解了树和二叉树的特性和操作。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

二叉树实验报告

二叉树实验报告

实验报告实验:树和二叉树一、实验目的:1.掌握二叉树的存储实现2.掌握二叉树的遍历思想3.掌握二叉树的常见算法的程序实现二、实验内容:1.编写函数,输入字符序列,建立二叉树的二叉链表。

2.编写函数,实现二叉树的中序递归遍历算法。

(最好也能实现前缀和后缀遍历算法)3.编写函数,实现二叉树的中序非递归遍历算法。

4.编写函数,借助队列实现二叉树的层次遍历算法。

5.编写函数,求二叉树的高度。

6.编写函数,求二叉树的结点个数。

7.编写函数,求二叉树的叶子个数。

8.编写函数,交换二叉树每个结点的左子树和右子树。

9.编写一个主函数,在主函数中设计一个简单的菜单,分别调试上述算法。

三、方法与步骤:详见源代码。

四、小结:1.注意并理解了递归算法的执行步骤,使得编写程序时比较顺利,而且得到同学的帮助,减少了发生错误的次数,才使得报告能够顺利完成。

2.注意字符类型数据在输入时的处理,使输入没有错误。

3.重点理解利用栈结构实现非递归算法。

五、实验结果:实验报告源代码:#include"stdio.h"#include"malloc.h"#include"math.h"#define maxsize 100typedef struct btnode{char data;struct btnode *lc,*rc;}bitree;bitree *creat_bitree(bitree *p){char a;scanf("%c",&a);if(a!='#'){ p=(bitree *)malloc(sizeof(bitree));p->data=a;p->lc=creat_bitree(p->lc);p->rc=creat_bitree(p->rc);}elsep=NULL;return p;}void print1_bitree1(bitree *p){if(p==NULL)return ;printf("%c",p->data);print1_bitree1(p->lc);print1_bitree1(p->rc);}void print1_bitree2(bitree *p){if(p==NULL)return ;print1_bitree2(p->lc);printf("%c",p->data);print1_bitree2(p->rc);}void print1_bitree3(bitree *p) {if(p==NULL)return ;print1_bitree3(p->lc);print1_bitree3(p->rc);printf("%c",p->data);}int print2_bitree(bitree *p){int top=-1;bitree *a[maxsize];if(p==NULL) return 0;while(p!=NULL||top!=-1){while(p!=NULL){a[++top]=p;p=p->lc;}if(top<0)return 0;else{p=a[top--];printf("%c",p->data);p=p->rc;}}return 1;}int print3_bitree(bitree *p){int front=-1,rear=0;bitree *b[maxsize];if(p==NULL)return 0;b[rear]=p;while(front!=rear){p=b[++front];printf("%c",p->data);if(p->lc!=NULL)b[++rear]=p->lc;if(p->rc!=NULL)b[++rear]=p->rc;}return 1;}int jiedian_bitree(bitree *p,int a){if(p==NULL)return a;a++;a=jiedian_bitree(p->lc,a);a=jiedian_bitree(p->rc,a);return a;}int yezi_bitree(bitree *p){if(p==NULL)return 0;if(p->lc==NULL&&p->rc==NULL)return 1;return (yezi_bitree(p->lc)+yezi_bitree(p->rc)); }int depth(bitree *p){if(!p)return 0;else{int m=depth(p->lc);int n=depth(p->rc);return (m>n?m:n)+1;}}void change(bitree *p){bitree *q;if(!p)return;else{q=p->lc;p->lc=p->rc;p->rc=q;change(p->lc);change(p->rc);}}int main(){int x=8,a=0,i,j=0;bitree *p;p=NULL;while(x==8){printf("建立二叉链树,请输入字符\n");if(j==1){getchar();j=0;}p=creat_bitree(p);x=0;while(x!=8){ printf("***************************************************** *************************\n");printf("1.递归遍历\t2.中序非递归遍历\t3.层次遍历\t\t4.二叉树高度\n5.结点个数\t6.叶子个数\t\t7.交换每个结点左右子树\t8.重建二叉链树\n9.退出\n");scanf("%d",&x);switch(x){case 1:printf("1.先序2.中序3.后序");printf("\n");scanf("%d",&x);if(x==1)print1_bitree1(p);if(x==2)print1_bitree2(p);if(x==3)print1_bitree3(p);break;case 2:print2_bitree(p);break;case 3:print3_bitree(p);break;case 4:i=depth(p);printf("%d",i);break;case 5:a=jiedian_bitree(p,a);printf("%d",a);break;case 6:i=yezi_bitree(p);printf("%d",i);break;case 7:change(p);break;case 8:j=1;break;}if(x==9)break;printf("\n\n");}}return 0;}。

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

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

数据结构二叉树实验报告总结一、实验目的本次实验的主要目的是通过对二叉树的学习和实践,掌握二叉树的基本概念、性质和遍历方式,加深对数据结构中树形结构的理解。

二、实验内容1. 二叉树的基本概念和性质在本次实验中,我们首先学习了二叉树的基本概念和性质。

其中,二叉树是由节点组成的有限集合,并且每个节点最多有两个子节点。

同时,我们还学习了二叉树的高度、深度、层数等概念。

2. 二叉树的遍历方式在了解了二叉树的基本概念和性质之后,我们开始学习如何遍历一个二叉树。

在本次实验中,我们主要学习了三种遍历方式:前序遍历、中序遍历和后序遍历。

其中,前序遍历指先访问节点自身再访问左右子节点;中序遍历指先访问左子节点再访问自身和右子节点;后序遍历指先访问左右子节点再访问自身。

3. 二叉搜索树除了以上内容之外,在本次实验中我们还学习了一种特殊的二叉树——二叉搜索树。

二叉搜索树是一种特殊的二叉树,它的每个节点都满足左子节点小于该节点,右子节点大于该节点的性质。

由于这个性质,二叉搜索树可以被用来进行快速查找、排序等操作。

三、实验过程1. 实现二叉树的遍历方式为了更好地理解和掌握二叉树的遍历方式,我们首先在编程环境中实现了前序遍历、中序遍历和后序遍历。

在代码编写过程中,我们需要考虑如何递归地访问每个节点,并且需要注意访问顺序。

2. 实现二叉搜索树为了更好地理解和掌握二叉搜索树的特性和操作,我们在编程环境中实现了一个简单的二叉搜索树。

在代码编写过程中,我们需要考虑如何插入新节点、删除指定节点以及查找目标节点等操作。

3. 实验结果分析通过对代码运行结果进行分析,我们可以清晰地看到每个遍历方式所得到的结果以及对应的顺序。

同时,在对二叉搜索树进行操作时,我们也可以看到不同操作所产生的不同结果。

四、实验总结通过本次实验,我们进一步加深了对二叉树的理解和掌握,学习了二叉树的遍历方式以及二叉搜索树的特性和操作。

同时,在编程实践中,我们也进一步熟悉了代码编写和调试的过程。

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

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

实验5:树(二叉树)(采用二叉链表存储)一、实验项目名称二叉树及其应用二、实验目的熟悉二叉树的存储结构的特性以及二叉树的基本操作。

三、实验基本原理之前我们都是学习的线性结构,这次我们就开始学习非线性结构——树。

线性结构中结点间具有唯一前驱、唯一后继关系,而非线性结构中结点的前驱、后继的关系并不具有唯一性。

在树结构中,节点间关系是前驱唯一而后继不唯一,即结点之间是一对多的关系。

直观地看,树结构是具有分支关系的结构(其分叉、分层的特征类似于自然界中的树)。

四、主要仪器设备及耗材Window 11、Dev-C++5.11五、实验步骤1.导入库和预定义2.创建二叉树3.前序遍历4.中序遍历5.后序遍历6.总结点数7.叶子节点数8.树的深度9.树根到叶子的最长路径10.交换所有节点的左右子女11.顺序存储12.显示顺序存储13.测试函数和主函数对二叉树的每一个操作写测试函数,然后在主函数用while+switch-case的方式实现一个带菜单的简易测试程序,代码见“实验完整代码”。

实验完整代码:#include <bits/stdc++.h>using namespace std;#define MAX_TREE_SIZE 100typedef char ElemType;ElemType SqBiTree[MAX_TREE_SIZE];struct BiTNode{ElemType data;BiTNode *l,*r;}*T;void createBiTree(BiTNode *&T){ElemType e;e = getchar();if(e == '\n')return;else if(e == ' ')T = NULL;else{if(!(T = (BiTNode *)malloc(sizeof (BiTNode)))){cout << "内存分配错误!" << endl;exit(0);}T->data = e;createBiTree(T->l);createBiTree(T->r);}}void createBiTree2(BiTNode *T,int u) {if(T){SqBiTree[u] = T->data;createBiTree2(T->l,2 * u + 1);createBiTree2(T->r,2 * u + 2); }}void outputBiTree2(int n){int cnt = 0;for(int i = 0;cnt <= n;i++){cout << SqBiTree[i];if(SqBiTree[i] != ' ')cnt ++;}cout << endl;}void preOrderTraverse(BiTNode *T) {if(T){cout << T->data;preOrderTraverse(T->l);preOrderTraverse(T->r);}}void inOrderTraverse(BiTNode *T) {if(T){inOrderTraverse(T->l);cout << T->data;inOrderTraverse(T->r);}}void beOrderTraverse(BiTNode *T){if(T){beOrderTraverse(T->l);beOrderTraverse(T->r);cout << T->data;}}int sumOfVer(BiTNode *T){if(!T)return 0;return sumOfVer(T->l) + sumOfVer(T->r) + 1;}int sumOfLeaf(BiTNode *T){if(!T)return 0;if(T->l == NULL && T->r == NULL)return 1;return sumOfLeaf(T->l) + sumOfLeaf(T->r);}int depth(BiTNode *T){if(!T)return 0;return max(depth(T->l),depth(T->r)) + 1;}bool LongestPath(int dist,int dist2,vector<ElemType> &ne,BiTNode *T) {if(!T)return false;if(dist2 == dist)return true;if(LongestPath(dist,dist2 + 1,ne,T->l)){ne.push_back(T->l->data);return true;}else if(LongestPath(dist,dist2 + 1,ne,T->r)){ne.push_back(T->r->data);return true;}return false;}void swapVer(BiTNode *&T){if(T){swapVer(T->l);swapVer(T->r);BiTNode *tmp = T->l;T->l = T->r;T->r = tmp;}}//以下是测试程序void test1(){getchar();cout << "请以先序次序输入二叉树结点的值,空结点用空格表示:" << endl; createBiTree(T);cout << "二叉树创建成功!" << endl;}void test2(){cout << "二叉树的前序遍历为:" << endl;preOrderTraverse(T);cout << endl;}void test3(){cout << "二叉树的中序遍历为:" << endl;inOrderTraverse(T);cout << endl;}void test4(){cout << "二叉树的后序遍历为:" << endl;beOrderTraverse(T);cout << endl;}void test5(){cout << "二叉树的总结点数为:" << sumOfVer(T) << endl;}void test6(){cout << "二叉树的叶子结点数为:" << sumOfLeaf(T) << endl; }void test7(){cout << "二叉树的深度为:" << depth(T) << endl;}void test8(){int dist = depth(T);vector<ElemType> ne;cout << "树根到叶子的最长路径:" << endl;LongestPath(dist,1,ne,T);ne.push_back(T->data);reverse(ne.begin(),ne.end());cout << ne[0];for(int i = 1;i < ne.size();i++)cout << "->" << ne[i];cout << endl;}void test9(){swapVer(T);cout << "操作成功!" << endl;}void test10(){memset(SqBiTree,' ',sizeof SqBiTree);createBiTree2(T,0);cout << "操作成功!" << endl;}void test11(){int n = sumOfVer(T);outputBiTree2(n);}int main(){int op = 0;while(op != 12){cout << "-----------------menu--------------------" << 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 << "--------------9:交换所有节点左右子女----" << endl;cout << "--------------10:顺序存储---------------" << endl;cout << "--------------11:显示顺序存储-----------" << endl;cout << "--------------12:退出测试程序-----------" << endl;cout << "请输入指令编号:" << endl;if(!(cin >> op)){cin.clear();cin.ignore(INT_MAX,'\n');cout << "请输入整数!" << endl;continue;}switch(op){case 1:test1();break;case 2:test2();break;case 3:test3();break;case 4:test4();break;case 5:test5();break;case 6:test6();break;case 7:test7();break;case 8:test8();break;case 9:test9();break;case 10:test10();break;case 11:test11();break;case 12:cout << "测试结束!" << endl;break;default:cout << "请输入正确的指令编号!" << endl;}}return 0;}六、实验数据及处理结果测试用例:1.创建二叉树(二叉链表形式)2.前序遍历3.中序遍历4.后序遍历5.总结点数6.叶子结点数7.树的深度8.树根到叶子的最长路径9.交换所有左右子女10.顺序存储七、思考讨论题或体会或对改进实验的建议通过这次实验,我掌握了二叉树的顺序存储和链式存储,体会了二叉树的存储结构的特性,掌握了二叉树的树上相关操作。

树和二叉树实验报告

树和二叉树实验报告

●实验内容:实验三树和二叉树1.编写函数,输入字符序列,建立二叉树的二叉链表。

2.编写函数,实现二叉树的中序递归遍历算法。

(最好也能实现前缀和后缀遍历算法)3.编写函数,实现二叉树的中序非递归遍历算法。

4.编写函数,借助队列实现二叉树的层次遍历算法。

5.编写函数,求二叉树的高度。

6.编写函数,求二叉树的结点个数。

7.编写函数,求二叉树的叶子个数。

8.编写函数,交换二叉树每个结点的左子树和右子树。

9.编写一个主函数,在主函数中设计一个简单的菜单,分别调试上述算法。

●实验目的及要求:1.掌握二叉树的存储实现2.掌握二叉树的遍历思想3.掌握二叉树的常见算法的程序实现●实验内容、方法与步骤:(使用附页填写并附在本页后)见附页●实验结果:见附页●小结:通过本次实验,我基本掌握了二叉树的存储实现和二叉树的遍历思想,并且实现了二叉树的几种常见算法。

分数:批阅老师:200 年月日第 1 页/ 共13 页实验报告(附页)#include <stdio.h>#include <stdlib.h>#define OK 1#define ERROR 0#define OVERFLOW -2typedef int status;typedef struct BiNode//二叉链表{char Data;struct BiNode* lChild;struct BiNode* rChild;}BiNode,*pBiNode;typedef struct SNode/*链栈的结点类型*/{pBiNode elem; /*栈中的元素是指向二叉链表结点的指针*/struct SNode *next;}SNode;struct link //队列链表{struct BiNode *p;struct link *next;};status CreateTree(BiNode** pTree);status PreOrderTraval(BiNode* pTree);//前序递归status InOrderTraval(BiNode* pTree);//中序递归status PostOrderTraval(BiNode* pTree);//后序递归status st_InOrderTraverse(BiNode* pTree);//中序非递归遍历void TreeLink(BiNode* pTree); //队列实现层次遍历int TreeHeight (BiNode* pTree);//二叉树的高度int Count(BiNode* pTree);//结点个数int TreeNumber(BiNode* pTree);//叶子个数void Exchange (BiNode* pTree);//交换左右子树status Visit(char Data);void Display(BiNode* pTree,int Level);BiNode *pRoot=NULL;status CreateTree(BiNode** pTree) /*Input Example: abd##e##cf##g##*/ {char ch;scanf("%c",&ch);if(ch=='#'){(*pTree)=NULL;}else{if(!((*pTree)=(BiNode*)malloc(sizeof(BiNode)))) {exit(OVERFLOW);}(*pTree)->Data=ch;CreateTree(&((*pTree)->lChild));CreateTree(&((*pTree)->rChild));}return OK;}status PreOrderTraval(BiNode* pTree)//前序递归{if(pTree){if(Visit(pTree->Data)){if(PreOrderTraval(pTree->lChild)){if(PreOrderTraval(pTree->rChild)){return OK;}}}return ERROR;}else{return OK;}}status InOrderTraval(BiNode* pTree)//中序递归{if(pTree){if(InOrderTraval(pTree->lChild)){if(Visit(pTree->Data)){if(InOrderTraval(pTree->rChild)){return OK;}}return ERROR;}return ERROR;}else{return OK;}}status PostOrderTraval(BiNode* pTree)//后序递归{if(pTree){if(PostOrderTraval(pTree->lChild)){if(PostOrderTraval(pTree->rChild)){if(Visit(pTree->Data)){return OK;}return ERROR;}}return ERROR;}else{return OK;}}status st_InOrderTraverse(BiNode* pTree)//中序非递归遍历{BiNode *p;SNode *q,*Stop=NULL; /*用不带头结点的单链表作为栈的存储结构*/ p=pTree;while(p!=NULL||Stop!=NULL) /*不是空树*/{if(p!=NULL){q=(SNode*)malloc(sizeof(SNode));if(q==NULL)return ERROR;q->next=Stop;q->elem=p;Stop=q; /*根结点指针入栈*/p=p->lChild; /*进入根的左子树*/}else{q=Stop;Stop=Stop->next; /*栈顶元素出栈*/printf("%c ",q->elem->Data);/*访问根结点*/p=q->elem->rChild; /*进入根的右子树*/free(q); /*释放原栈顶元素的结点空间*/}}return OK;}void TreeLink(BiNode* pTree) //队列实现层次遍历{struct link *head,*rear,*temp;head=(struct link *)malloc(sizeof(struct link));head->p=pTree;head->next=NULL;rear=head;do{if(head->p->lChild!=NULL){temp=(struct link *)malloc(sizeof(struct link));temp->p=head->p->lChild;temp->next=NULL;rear->next=temp;rear=temp;}if(head->p->rChild!=NULL){temp=(struct link *)malloc(sizeof(struct link));temp->p=head->p->rChild;temp->next=NULL;rear->next=temp;rear=temp;}temp=head;printf("%c ",head->p->Data);head=head->next;free(temp);}while(head!=NULL);}int TreeHeight(BiNode* pTree)//二叉树的高度{int hl ,hr ; //左右子树的高度if (pTree == NULL)return 0 ;elsehl = TreeHeight(pTree-> lChild);hr = TreeHeight (pTree-> rChild);if (hl>hr)return (hl +1);elsereturn (hr +1);}int Count(BiNode* pTree)//结点个数{return pTree == NULL ? 0 : Count(pTree->lChild) + Count(pTree->rChild) + 1;}int TreeNumber(BiNode* pTree)//叶子个数{if (pTree==NULL)return 0;if (pTree->lChild ==NULL && pTree->rChild == NULL)return 1;return TreeNumber(pTree->lChild)+TreeNumber(pTree->rChild);//+1就可以求出结点个数}void Exchange (BiNode* pTree )//交换左右子树{BiNode* temp;if ( pTree->lChild != NULL || pTree->rChild != NULL ){temp = pTree->lChild;pTree->lChild = pTree->rChild;pTree->rChild = temp;Exchange ( pTree->lChild );Exchange ( pTree->rChild );}}status Visit(char Data){printf("%c ",Data);return OK;}void Display(BiNode* pTree,int Level)//显示整个树{int i;if(pTree==NULL) return;Display(pTree->rChild,Level+1);for(i=0;i<Level-1;i++){printf(" ");}if(Level>=1){printf("--");}printf("%c\n",pTree->Data);Display(pTree->lChild,Level+1);}void CmdList() //显示命令列表{printf("\n_____________________________________________\n");printf(" 请选择操作: \n");printf(" 1.前序递归遍历\n"); //前序递归遍历printf(" 2.中序递归遍历\n"); //中序递归遍历printf(" 3.后序递归遍历\n"); //后序递归遍历printf(" 4.中序非递归遍历\n"); //中序非递归遍历printf(" 5.层次遍历\n"); //层次遍历printf(" 6.求二叉树高度\n"); //二叉树高度printf(" 7.求结点个数\n"); //二叉树的结点个数printf(" 8.求叶子个数\n"); //二叉树的叶子个数printf(" 9.交换左右子树\n"); //交换左右子树printf(" 0.退出程序\n"); //退出printf("\n______________________________________________\n");}void init(){system ("cls");printf("* * * * * * * * * * * * * * * * * * * * * * * * *\n");printf("实验三树和二叉树\n");printf("03计本3班\n");printf("樊海军 2B0324151138\n");printf("* * * * * * * * * * * * * * * * * * * * * * * * *\n");printf("本程序实现二叉树的常见算法。

数据结构实验5 树和二叉树

数据结构实验5 树和二叉树
运行结果截图:
四、分析与讨论
对上机实践结果进行分析,上机的心得体会。
五、教师评语
签名:
日期:Biblioteka 成绩附源程序清单:5、其他二叉树的算法,特别是利用书的结构进行递归的算法。
二、实验设备(环境)及要求
微型计算机;
windows操作系统;
Microsoft Visual Studio 6.0集成开发环境。
三、实验内容与步骤
1、定义二叉树节点;
2、实现二叉树的生成、遍历(前序,中序和后序)、查询二叉树中某个节点、统计二叉树节点个数、统计二叉树叶子节点个数、求二叉树的深度、复制二叉树等函数。这些函数,如有可能,尽量实现递归和非递归的版本。
《数据结构》实验报告
实验序号:5实验项目名称:树和二叉树的操作
学 号
姓 名
专业、班
实验地点
指导教师
实验时间
一、实验目的及要求
1、进一步掌握指针变量、动态变量的含义。
2、掌握二叉树的结构特征,以及各种存储结构的特点及适用范围。
3、掌握用指针类型描述、访问和处理二叉树的运算。
4、掌握用二叉树前序、中序、后序、层次遍历的方法。

树和二叉树实验报告

树和二叉树实验报告

树和二叉树一、实验目的1.掌握二叉树的结构特征,以及各种存储结构的特点及适用范围。

2.掌握用指针类型描述、访问和处理二叉树的运算。

二、实验要求1.认真阅读和掌握本实验的程序。

2.上机运行本程序。

3.保存和打印出程序的运行结果,并结合程序进行分析。

4.按照二叉树的操作需要,重新改写主程序并运行,打印出文件清单和运行结果。

三、实验内容1.输入字符序列,建立二叉链表。

2.按先序、中序和后序遍历二叉树(递归算法)。

3.按某种形式输出整棵二叉树。

4.求二叉树的高度。

5.求二叉树的叶节点个数。

6.交换二叉树的左右子树。

7.借助队列实现二叉树的层次遍历。

8.在主函数中设计一个简单的菜单,分别调试上述算法。

为了实现对二叉树的有关操作,首先要在计算机中建立所需的二叉树。

建立二叉树有各种不同的方法。

一种方法是利用二叉树的性质5来建立二叉树,输入数据时要将节点的序号(按满二叉树编号)和数据同时给出:(序号,数据元素0)。

另一种方法是主教材中介绍的方法,这是一个递归方法,与先序遍历有点相似。

数据的组织是先序的顺序,但是另有特点,当某结点的某孩子为空时以字符“#”来充当,也要输入。

若当前数据不为“#”,则申请一个结点存入当前数据。

递归调用建立函数,建立当前结点的左右子树。

四、解题思路1、先序遍历:○1访问根结点,○2先序遍历左子树,○3先序遍历右子树2、中序遍历:○1中序遍历左子树,○2访问根结点,○3中序遍历右子树3、后序遍历:○1后序遍历左子树,○2后序遍历右子树,○3访问根结点4、层次遍历算法:采用一个队列q,先将二叉树根结点入队列,然后退队列,输出该结点;若它有左子树,便将左子树根结点入队列;若它有右子树,便将右子树根结点入队列,直到队列空为止。

因为队列的特点是先进后出,所以能够达到按层次遍历二叉树的目的。

五、程序清单#include<stdio.h>#include<stdlib.h>#define M 100typedef char Etype; //定义二叉树结点值的类型为字符型typedef struct BiTNode //树结点结构{Etype data;struct BiTNode *lch,*rch;}BiTNode,*BiTree;BiTree que[M];int front=0,rear=0;//函数原型声明BiTNode *creat_bt1();BiTNode *creat_bt2();void preorder(BiTNode *p);void inorder(BiTNode *p);void postorder(BiTNode *p);void enqueue(BiTree);BiTree delqueue( );void levorder(BiTree);int treedepth(BiTree);void prtbtree(BiTree,int);void exchange(BiTree);int leafcount(BiTree);void paintleaf(BiTree);BiTNode *t;int count=0;//主函数void main(){char ch;int k;do{printf("\n\n\n");printf("\n===================主菜单===================");printf("\n\n 1.建立二叉树方法1");printf("\n\n 2.建立二叉树方法2");printf("\n\n 3.先序递归遍历二叉树");printf("\n\n 4.中序递归遍历二叉树");printf("\n\n 5.后序递归遍历二叉树");printf("\n\n 6.层次遍历二叉树");printf("\n\n 7.计算二叉树的高度");printf("\n\n 8.计算二叉树中叶结点个数");printf("\n\n 9.交换二叉树的左右子树");printf("\n\n 10.打印二叉树");printf("\n\n 0.结束程序运行");printf("\n============================================");printf("\n 请输入您的选择(0,1,2,3,4,5,6,7,8,9,10)");scanf("%d",&k);switch(k){case 1:t=creat_bt1( );break; //调用性质5建立二叉树算法case 2:printf("\n请输入二叉树各结点值:");fflush(stdin);t=creat_bt2();break; //调用递归建立二叉树算法case 3:if(t){printf("先序遍历二叉树:");preorder(t);printf("\n");}else printf("二叉树为空!\n");break;case 4:if(t){printf("中序遍历二叉树:");inorder(t);printf("\n");}else printf("二叉树为空!\n");break;case 5:if(t){printf("后序遍历二叉树:");postorder(t);printf("\n");}else printf("二叉树为空!\n");break;case 6:if(t){printf("层次遍历二叉树:");levorder(t);printf("\n");}else printf("二叉树为空!\n");break;case 7:if(t){printf("二叉树的高度为:%d",treedepth(t));printf("\n");}else printf("二叉树为空!\n");break;case 8:if(t){printf("二叉树的叶子结点数为:%d\n",leafcount(t));printf("二叉树的叶结点为:");paintleaf(t);printf("\n");}else printf("二叉树为空!\n");break;case 9:if(t){printf("交换二叉树的左右子树:\n");exchange(t);prtbtree(t,0);printf("\n");}else printf("二叉树为空!\n");break;case 10:if(t){printf("逆时针旋转90度输出的二叉树:\n");prtbtree(t,0);printf("\n");}else printf("二叉树为空!\n");break;case 0:exit(0);} //switch}while(k>=1&&k<=10);printf("\n再见!按回车键,返回…\n");ch=getchar();} //main//利用二叉树性质5,借助一维数组V建立二叉树BiTNode *creat_bt1(){ BiTNode *t,*p,*v[20];int i,j;Etype e;/*输入结点的序号i、结点的数据e*/printf("\n请输入二叉树各结点的编号和对应的值(如1,a):");scanf("%d,%c",&i,&e);while(i!=0&&e!='#') //当i为0,e为'#'时,结束循环{p=(BiTNode*)malloc(sizeof(BiTNode));p->data=e;p->lch=NULL;p->rch=NULL;v[i]=p;if(i==1)t=p; //序号为1的结点是根else{j=i/2;if(i%2==0)v[j]->lch=p; //序号为偶数,作为左孩子else v[j]->rch=p; //序号为奇数,作为右孩子}printf("\n请继续输入二叉树各结点的编号和对应的值:");scanf("%d,%c",&i,&e);}return(t);}//creat_bt1;//模仿先序递归遍历方法,建立二叉树BiTNode *creat_bt2(){BiTNode *t;Etype e;scanf("%c",&e);if(e=='#')t=NULL; //对于'#'值,不分配新结点else{t=(BiTNode *)malloc(sizeof(BiTNode));t->data=e;t->lch=creat_bt2(); //左孩子获得新指针值t->rch=creat_bt2(); //右孩子获得新指针值}return(t);} //creat_bt2//先序递归遍历二叉树void preorder(BiTNode *p){if(p){printf("%3c",p->data);preorder(p->lch);preorder(p->rch);}} //preorder//中序递归遍历二叉树void inorder(BiTNode *p){if(p){inorder(p->lch);printf("%3c",p->data);inorder(p->rch);}} //inorder//后序递归遍历二叉树void postorder(BiTNode *p) { if(p){ postorder(p->lch);postorder(p->rch);printf("%3c",p->data);}} //postordervoid enqueue(BiTree T){if(front!=(rear+1)%M){rear=(rear+1)%M;que[rear]=T;}}BiTree delqueue( ){if(front==rear)return NULL;front=(front+1)%M;return(que[front]);}void levorder(BiTree T) //层次遍历二叉树{BiTree p;if(T){enqueue(T);while(front!=rear){p=delqueue( );printf("%3d",p->data);if(p->lch!=NULL)enqueue(p->lch);if(p->rch!=NULL)enqueue(p->rch);}}}int treedepth(BiTree bt) //计算二叉树的高度{int hl,hr,max;if(bt!=NULL){ hl=treedepth(bt->lch);hr=treedepth(bt->rch);max=(hl>hr)?hl:hr;return (max+1);}else return (0);}void prtbtree(BiTree bt,int level) //逆时针旋转90度输出二叉树树形{int j;if(bt){prtbtree(bt->rch,level+1);for(j=0;j<=6*level;j++)printf(" ");printf("%c\n",bt->data);prtbtree(bt->lch,level+1);}}void exchange(BiTree bt) //交换二叉树左右子树{BiTree p;if(bt){p=bt->lch;bt->lch=bt->rch;bt->rch=p; exchange(bt->lch);exchange(bt->rch);}}int leafcount(BiTree bt) //计算叶结点数{if(bt!=NULL){leafcount(bt->lch);leafcount(bt->rch);if((bt->lch==NULL)&&(bt->rch==NULL))count++;}return(count);}void paintleaf(BiTree bt) //输出叶结点{if(bt!=NULL){if(bt->lch==NULL&&bt->rch==NULL)printf("%3c",bt->data);paintleaf(bt->lch);paintleaf(bt->rch);}}图11.2所示二叉树的输入数据顺序应该是:abd#g###ce#h##f##。

树和二叉树实验报告_2

树和二叉树实验报告_2

实验报告班级: 软本101 学号: 2010417133姓名: 张明宇日期: 10月20号1.实验题目2.编辑一个程序, 用来演示树和二叉树的建立、遍历等操作。

3.需求分析本演示程序在Microsoft Visual C++ 6.0环境下编写调试, 完成二叉树的建立、遍历、深度求解等。

(1)建立二叉树: 进入程序运行界面后, 提示我们输入要建立的二叉树, 并默认以先序序列输入。

若第一个输入为“#”, 则为空树。

否则按照从左子树到右子树的顺序建立该二叉树, 用#代表虚结点, 如ABD###CE##F##。

建立完二叉树后按“ENTER”键自动进入下一个功能模块的实现。

(2)实现各个遍历递归算法: 实现该二叉树的先序遍历、中序遍历和后序遍历递归算法, 逐个访问该二叉树的左右子树, 并输出各遍历序列。

(3)统计出该二叉树中叶子节点个数和高度:只要该二叉树的移动指针t 所指向的节点非空, 进一步判断其左右子树是否也都为空, 让表示节点的变量能够记录叶子节点个数和深度。

(4)实现层次遍历算法:利用队列“先进先出”的原则, 按照“根左右”的顺序前后将整棵树入队, 并输出。

概要设计(1)为了实现上述程序功能, 需要定义二叉树的数据结构。

二叉树单个元素的结构如图1.1所示。

图1.1 二叉树元素的数据结构(2)本程序包含7个函数:①主函数main()。

②树的建立函数CreatBinTree()。

③先序遍历函数Preorder()。

④中序遍历函数Inorder()。

⑤后序遍历函数Postorder()。

⑥求叶子深度和二叉树深度函数TreeDepth()。

⑦层次遍历函数Levelorder()。

各函数间的关系如图1.2所示。

图1.2 程序所包含各函数之间的关系4.详细设计(1)实现概要设计中定义的所有的数据类型, 对每个操作给出具体的算法;对主程序和其他模块也都需要写出具体算法。

数据类型。

用C语言描述如下:typedef struct BinTNode{char data;struct BinTNode *lchild,*rchild;}BinTNode,*BinTree;(2)线性表的基本操作函数的具体算法。

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

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

《数据结构〉课程实验报告实验名称树与二叉树实验序号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;。

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

学生实验报告
学院:软通学院
课程名称:数据结构与算法
专业班级:软件142 班
姓名:邹洁蒙
学号: 0143990
学生实验报告
(二)
一、实验综述
1、实验目的及要求
目的:1)掌握树与二叉树的基本概念;
2)掌握二叉树的顺序存储,二叉链表的先序遍历中序遍历和后序遍历算法;
3)掌握树的双亲表示法。

要求:1)编程:二叉树的顺序存储实现;
2)编程:二叉链表的先序遍历中序遍历和后序遍历实现;
3)编程:树的双亲表示法实现。

2、实验仪器、设备或软件
设备:PC
软件:VC6
二、实验过程(编程,调试,运行;请写上源码,要求要有注释)
1.编程:二叉树的顺序存储实现
代码:
BiTree::BiTree()//建立存储空间
{
data = new int[MAXSIZE];
count = 0;
}
void BiTree::AddNode(int e)//加结点
{
int temp = 0;
data[count] = e;
count++;//从编号0开始保存
}
运行截图:
2.编程:二叉链表的先序遍历中序遍历和后序遍历实现代码:
void InOrderTraverse(BiTree* Head)//中序遍历
{
if (Head)
{
InOrderTraverse(Head->LeftChild);
cout << Head->data<<" ";
InOrderTraverse(Head->RightChild);
}
}
void PreOrderTraverse(BiTree* Head)//先序遍历
{
if (Head)
{
cout << Head->data << " ";
PreOrderTraverse(Head->LeftChild);
PreOrderTraverse(Head->RightChild);
}
}
void PostOrderTraverse(BiTree* Head)//后序遍历
{
if (Head)
{
PostOrderTraverse(Head->LeftChild);
PostOrderTraverse(Head->RightChild);
cout << Head->data << " ";
}
}
运行截图:
3.编程:树的双亲表示法实现
代码:
void CreateRoot(BiTree* &Head, int e)//建立一个根节点,并且把头指针给Head
{
Head = new BiTree;
Head->data = e;
Head->LeftChild = NULL;
Head->RightChild = NULL;
}
void AddLeftChild(BiTree* &T, int e)//加一个左孩子
{
T->LeftChild = new BiTree;
T->LeftChild->data = e;
T->LeftChild->LeftChild = NULL;
T->LeftChild->RightChild = NULL;
}
void AddRightChild(BiTree* &T, int e)//加一个右孩子
{
T->RightChild = new BiTree;
T->RightChild->data = e;
T->RightChild->LeftChild = NULL;
T->RightChild->RightChild = NULL;
}
运行截图:
三、结论
1、实验总结(碰到了什么问题,如何解决?)
①预习时对二叉树性质3不理解,后来上课听老师讲,弄明白了。

②刚开始对二叉树的遍历不太理解,后来我仔细看了知识点和做了几道相关例题之后,弄懂了。

③在练习树与二叉树的编程基础题时,没思路,后来自己看书和问同学能够自己编写出来了。

2、分析讨论(个人体会和心得)
一分耕耘,一分收获。

不管在学习数据结构这门课程还是在做其他的事时都要认真对待,踏踏实实地去完成。

一件事情,你用了多少心,结果一出来便见分晓。

面对困难,比如说比较难懂的知识点,不要灰心,要坚持,在坚持不住时再坚持一下,你便做到了常人不能做到的事情,这才是成功者该有的品质。

我觉得自己要多努力,要见贤思齐,见不贤而内自省,才能让自己不再是井底之蛙,才能使自己的大学生活变得更充实。

好的生活习惯和学习习惯也是很重要的。

希望通过自己一次一次的反省和思考,能够学好专业知识和完善自己的品格。

四、指导教师评语及成绩:
成绩:指导教师签名:严军勇
批阅日期:2015年5月25日。

相关文档
最新文档