实验3 二叉树及其应用

合集下载

实习三 二叉树及其应用

实习三 二叉树及其应用

实习三树、二叉树及其应用题目:唯一地确定一棵二叉树实习时间:2012/10/30一、需求分析1.问题描述:如果给出了遍历二叉树的前序序列和中序序列,则可以构造出唯一的一棵二叉树。

试编写实现上述功能的程序。

2.基本要求: 已知一棵二叉树的前序和中序序列,试设计完成下列任务的一个算法:(1)构造一棵二叉树;(2)证明构造正确(即分别以前序和中序遍历该树,将得到的结果与给出的序列进行比较)。

3.测试数据: 前序序列为ABDEGCFHIJ,中序序列为DBGEAHFIJC。

二、设计二、 1. 设计思想二、(1)存储结构二、用两个一维数组A和B分别存放前序和中序序列。

(2)主要算法基本思想①将前序和中序序列分别读入数组A和B。

②根据定义,前序序列中第一个元素一定是树根,在中序序列中该元素之前的所有元素一定在左子树中,其余元素则在右子树中。

所以,首先从数组A中取出第一个元素A[0]作根结点,然后在数组B中找到A[0],以它为界,在其前面的是左子树中序序列,在其后面的是右子树中序序列。

③若左子树不为空,沿前序序列向后移动,找到左子树根结点,转②。

④左子树构造完毕后,若右子树不为空,沿前序序列向后移动,找到右子树根结点,转②。

⑤前序序列中各元素取完则二叉树构造完毕。

⑥对二叉树进行前序和中序遍历,并将结果分别与数组A和B进行比较,若相同,则证明二叉树构造正确。

2. 设计表示(1)函数调用关系图main→StackPush→QueueAppend→QueueAd→StackPop→QueueGet(2)函数接口规格说明void PrintTree(BiTreeNode root,int n) //以root为根节点的树凹形输出void Initiate(BiTreeNode *root) // 以root为根节点的树初始化void PreOrder(BiTreeNode bt) //前序遍历以bt为根结点指针的二叉树void InOrder(BiTreeNode bt) //中序遍历以bt为根结点指针的二叉树int Creattree(DataType *pre,DataType *in,int al,BiTreeNode &T) //用前序序列和中序序列构造以T 为根节点的树,其中pre,in分别为前序序列和中序序列的首地址,al为中序序列的长度。

实验三 二叉树

实验三  二叉树

实验三二叉树
一、实验目的
1.掌握二叉树的链式存储结构及其相关操作的实现。

2.掌握二叉树的先序、中序、后序的递归遍历算法。

3.理解二叉树的各种非递归遍历算法的实现。

二、实验要求
1.实验前做好充分准备,包括复习第六章所学内容,事先预习好本次实验内容。

2.实验时记录实验结果,按要求完成各题。

3.实验结束后,给出实验总结与分析并及时给出本次实验的实验报告。

三、实验题目
本次实验给出的选定题目如下表所示。

说明:
(1)实验内容1)为必做内容。

(2)实验内容2)与实验内容3)为选做内容。

四、实验内容与要求
1、实验题目一:(1)二叉树的创建、递归遍历及其它基本操作的实现。

要求:定义用二叉链表表示的二叉树,并实现二叉树的创建、遍历(先序、中序后序)的递归算法及求深度操作等,并对其进行验证。

2、实验题目二:二叉树非递归遍历算法的实现
要求:在题目一的基础上,实现二叉树的非递归遍历算法(先序、中序、后序或按层),并对其进行验证。

3、实验题目三:哈夫曼树及哈夫曼编码的算法实现
要求:编程实现哈夫曼树的创建及利用哈夫曼树求解哈夫曼编码。

实验三二叉树基本操作与应用实验

实验三二叉树基本操作与应用实验

实验三二叉树基本操作与应用实验第一篇:实验三二叉树基本操作与应用实验实验三二叉树基本操作与应用实验第三次实验主要包括两部分内容:1.二叉树基本操作实验;2.二叉树应用—赫夫曼树与赫夫曼编码实验。

基本操作包括存储结构建立和遍历算法,本文只给出部分参考程序,请大家尽量完成多数基本操作。

第一部分基本操作实验[问题描述] 二叉树采用二叉链表作存储结构,试编程实现二叉树的如下基本操作1.按先序序列构造一棵二叉链表表示的二叉树T;2.对这棵二叉树进行遍历:先序、中序、后序以及层次遍历序列,分别输出结点的遍历序列;3.求二叉树的深度,结点数目,叶结点数目; [数据描述] //二叉树的二叉链表存储表示先序遍历二叉树递归算法6.层次遍历二叉树的非递归算法7.求二叉树的深度[说明]1.按先序次序输入二叉树中结点的值,用‘#’表示空树,对每一个结点应当确定其左右子树的值(为空时必须用特定的空字符占位),故执行此程序时,最好先在纸上画出你想建立的二叉树,每个结点的左右子树必须确定。

若为空,则用特定字符标出,然后再按先序输入这棵二叉树的字符序列。

2.为了简化程序的书写量,以及程序的清晰性,对结点的访问以一条输出语句表示,若有更复杂的或多种访问,可以将结点的访问编写成函数,然后通过函数指针进行函数的调用。

读者若有兴趣,可自行编写。

3.c语言函数参数传递,都是以“传值”的方式,故在设计函数时,必须注意参数的传递。

若想通过函数修改实际参数的值,则必须用指针变量作参数。

具体设计时;读者一定要把指针变量及指针变量指向的值等概念弄清楚。

4.完整参考程序只给出了部分遍历算法,对于其他算法,请读者参照示例,自行编程完成,以加深学习体会。

对于二叉链表的建立也是如此,示例中只是给出了先序法建立过程,读者可自行练习中序、后序二叉链表建立法,叶子结点或二叉树结点总数求法等。

第二部分二叉树应用实验---------郝夫曼树与郝夫曼编码[问题描述] 利用HuffMan编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。

实验三 二叉树的操作及应用

实验三  二叉树的操作及应用

实验三二叉树的操作及应用实验课程名:数据结构与算法专业班级:15计科1班学号:201540410109 姓名:刘江实验时间:2016.10.24-10.31 实验地点:K4-102 指导教师:冯珊成绩:一、实验目的及要求1、进一步掌握指针变量、动态变量的含义。

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

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

二、实验内容任务一:完成下列程序,该程序以二叉链表作存储结构,构建如图1所示的二叉树,并依次进行二叉树的前序、中序、后序及层次遍历。

图1解答:(1)源代码:#include<stdio.h>#include<stdlib.h>#define OK 1#define ERROR 0typedef char DataType;/* 二叉树节点的存储类型 */typedef struct Node //define stricture BiTree{ DataType data;struct Node *lchild,*rchild;}Node, *BiTree;/*按先序序列建立一棵二叉树*/BiTree CreatBiTree(BiTree &T){DataType ch;scanf("%c",&ch);if(ch==' ') {T=NULL;}else{if(!(T=(Node*)malloc(sizeof(Node)))){printf("Overflow.\n") ;exit(0);}T->data =ch;CreatBiTree(T->lchild );CreatBiTree(T->rchild );}return T;}void PrintData(DataType x){printf("%c",x);}void PreOrder(BiTree T, void (*Visit)( DataType item))/*前序遍历二叉树T,访问操作为Visit()函数*/{if(T!= NULL){Visit(T->data);PreOrder(T->lchild, Visit);PreOrder(T->rchild, Visit);}}void InOrder(BiTree T, void (*Visit)( DataType item)) /*中序t */ {if(T!= NULL){InOrder(T->lchild, Visit);Visit(T->data);InOrder(T->rchild, Visit);}}void PostOrder(BiTree T, void (*Visit)( DataType item)) /*后序 */ {if(T!= NULL){PostOrder(T->lchild, Visit);PostOrder(T->rchild, Visit);Visit(T->data);}}int main(){int choice;BiTree root;printf("下面建立一棵二叉树,结点数据输入按先序次序。

实验三二叉树及其应用(2次上机)

实验三二叉树及其应用(2次上机)

实验三 二叉树及其应用(2次上机)【上机时间】第5~7次【实验目的】树是一种应用极为广泛的数据结构之一,是本课程的重点。

树是一种1:N 的非线性结构。

本章首先以二叉树这种特殊、简单的树为原型,讨论数据元素(结点)之间的1:N(N=0,1,2)关系的表示(顺序映像——完全二叉树的顺序存储;链式映像——二叉链表、三叉链表);重点介绍二叉树的各种遍历算法(先序、中序、后序、层次遍历);并以这些遍历算法为基础,进一步讨论二叉树的其他各种问题的求解算法。

然后,展开对一般树的表示(双亲表示法、孩子表示法、孩子-兄弟表示法)和操作算法的讨论;强调树(森林)的孩子-兄弟表示法及其相关应用;并将表示树(森林)的孩子-兄弟链映射到表示二叉树的二叉链,从而获得树(森林)与二叉树的相互转换。

本实验以二叉树的链式表示、建立和应用为基础,旨在让学生深入了解二叉树的存储表示特征以及遍历次序与二叉树的存储结构之间的关系,进一步掌握利用遍历思想解决二叉树中相关问题的方法。

本实验的另一个目的是让学生通过思考、上机实践与分析总结,理解计算机进行算术表达式解析、计算的可能方法,初步涉及一些编译技术,增加自己今后学习编译原理的兴趣,并奠定一些学习的基础。

【实验内容】本实验由以下环节组成:1) 存储结构以二叉链表或三叉链表作为二叉树的存储结构;2) 二叉树的创建(链式存储)以某一种遍历的次序录入二叉树的元素,写出相应的二/三叉链表的创建算法,并上机实现该算法;二叉树的输入次序可以有如下几种方法,你可以选择其中之一来作为二/三叉链表创建程序的输入:(1) 添加虚结点补足成完全二叉树,对补足虚结点后的二叉树按层次遍历次序输入。

如图1的二叉树输入次序为:A, B, C, Φ, D, E, F, Φ, Φ, G , Φ, Φ, H也可以通过添加虚结点,为每一实在结点补足其孩子,再对补足虚结点后的二叉树按层次遍历的次序输入。

如图1的二叉树输入次序为:A, B, C, Φ, D, E, F, G , Φ, Φ, H , Φ, Φ, Φ, Φ, Φ, Φ进一步改进,可以在输入列表中忽略出现在列表尾部的虚结点,即:A, B, C, Φ, D, E, F, G , Φ, Φ, H(2) 通过添加虚结点,将二叉树中的每一实在结点补足成度为2的结点,对补足虚图 1结点后的二叉树按先序遍历的次序输入。

数据结构实验3:二叉树的操作

数据结构实验3:二叉树的操作

TextFile中。

(4) P:打印代码文件(Print)。

将文件CodeFile以紧凑格式显示在终端上,每行50个代码。

同时将此字符形式的编码文件写入文件CodePrin中。

(5) T:打印哈夫曼树(Tree printing)。

将已在内存中的哈夫曼树以直观的方式显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。

3) 实现提示:(1) 文件CodeFile的基类型可以设为字节型。

(2) 用户界面可以设计为“菜单”方式:显示上述功能符号,再加上“Q”,表示退出运行Quit。

请用户键入一个选择功能符。

此功能执行完毕后再显示此菜单,直至某次用户选择了“E”为止。

(3) 在程序的一次执行过程中,第一次执行I、D或C命令之后,哈夫曼树已经在内存了,不必再读入。

每次执行中不一定执行I命令,因为文件hfmTree可能早已建好。

三、实验过程与实验结果实验3-01:以二叉链表为存储结构,实现二叉树的创建、遍历数据结构定义:typedef struct BiTNode{char data;BiTNode *lchild, *rchild;}BiTNode;typedef BiTNode *BiTree;算法设计思路简介:本实验需要实现以下操作:二叉树的初始化、前中后序遍历等基本操作1.利用递归实现前后序遍历,思路简洁,仅需要调整递归体的执行顺序即可实现。

2.利用非递归实现中序遍历,需要利用栈操作,按照中序遍历规则将节点依次入栈后出栈实现。

算法描述:图1 中序遍历(非递归)实现算法的实现和测试结果(参考OJ)实验3-02:编写算法交换二叉树中所有结点的左、右子树数据结构定义:typedef struct BiTNode{char data;BiTNode *lchild, *rchild;}BiTNode;typedef BiTNode *BiTree;算法设计思路简介:本实验需要实现以下操作:二叉树的初始化、前中后序遍历等基本操作1.利用递归实现前后序遍历,思路简洁,仅需要调整递归体的执行顺序即可实现。

二叉树 实验报告

二叉树 实验报告

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

实验3 二叉树的操作及应用

实验3 二叉树的操作及应用

实验3 二叉树的操作及应用PB13000818 焦孟娇实验目的:1. 熟练掌握递归程序设计的方法。

2. 掌握二叉树的特性和基本算法。

问题描述:二叉树是一种基本且常用的数据结构。

二叉树的很多基本算法都可以用递归的形式来表述。

本实验要求实现二叉树的如下操作:创建、销毁、复制、打印显示、先中后序遍历、查找元素、层序遍历、求二叉树的深度、宽度、结点数和叶子个数等。

实验内容:一、队列的抽象数据类型定义为:Queue operation{数据对象:数据关系:基本操作:InitQueue(&S)操作结果:构造一个空队列SQueueLength(S)初始条件:队列S已存在操作结果:返回S的元素个数,即队列的长度QueueEmpty(S)初始条件:队列S已存在操作结果:若S为空队列,则返回TRUE,否则FALSEEnQueue(&S, e)初始条件:队列S已存在操作结果:插入元素e为队列新元素DeQueue(&S, &e)初始条件:队列S已存在且非空操作结果:删除S的队头元素,并用e返回其值GetHead(S, &e)初始条件:队列S已存在且非空操作结果:用e返回S的队头元素ClearQueue(&S)初始条件:队列S已存在操作结果:将S清为空队列DeleteQueue(&S)初始条件:队列S已存在操作结果:队列S被销毁Print(S)初始条件:队列S已存在操作结果:输出队列S} Queue operationBiTree operation{InitBiTree( &T )// 操作结果:构造空二叉树T。

DestroyBiTree( &T )// 初始条件:二叉树T已存在。

// 操作结果:销毁二叉树T。

CreateBiTree( &T, definition )// 初始条件:definition给出二叉树T的定义。

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

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

实验3 二叉树及其应用
实验目的
1.加深对二叉树的结构特性的理解;
2.熟练掌握二叉树的存储结构,特别是二叉链表类的描述及其实现方法;
3.熟练掌握二叉树的遍历算法原理及实现;
4.学会编写实现二叉树的各种算法;
5.掌握二叉树的应用方法。

实验学时:建议2~4学时
实验内容
内容1:二叉树及其操作
【问题描述】
设计二叉树的二叉链表类,操作主要有建二叉树、遍历二叉树、求该二叉树中、的结点个数等。

【基本要求】
(1)建立二叉树可用先序方式建立,也可根据二叉树的先序和中序序列建立。

(2)对二叉树的遍历可采用递归或非递归的算法。

【实现提示】
(1)二叉链表的结点结构描述
struct btnode{ // 定义结点类型
ElemType data; //数据域
btnode * lchild,* rchild; //左、右指针域/
}; // btnode
(2)可设计以下功能函数:
btnode* createbitree(); //建立二叉链表
void preorder(btnode* bt); //先序遍历二叉树
int sum(btnode* bt); //求二叉树中的结点个数
算法可用递归或非递归实现。

建立二叉树可用以下两种算法实现:
方案1:btnode * createBT ( ) //前序建树
{ bitree T; char ch;
cin >>ch ;
if(ch==’#’) return NULL; //二叉树为空
T=new BinTNode; //申请根结点
T->data=ch;
T->lchild=createBTpre(); //创建根的左子树
1
2
T->rchild=createBTpre(); //创建根的右子树 return T; }
方案2:btnode* createBT ( char *preorder, char *midorder) { //由前序preorder 和中序midorder 建树,返回根指针 if(strlen (preorder) ==0) return NULL; //空二叉树 T= new Node; //建立根结点 T->data=*preorder;
k=locate(midorder , *preorder); //找根在中序中的位置 lmidorder=fetch(midorder,0,k); //左子树的中序 lpreorder =fetch(preorder,1,k); //左子树的前序 rmidorder=fetch(midorder,k+1); //右子树的中序 rpreorder =fetch(preorder, k+1); //右子树的前序 T->lchild=createBT (lmidorder , lpreorder);//建根的左子树 T->rchild=createBT(rmidorder , rpreorder); //建根的右子树 return T; }
int sum(btnode* bt) //求二叉树中的结点个数 { if(!bt) return 0; //二叉树为空
return sum(bt->lchild) + sum(bt->rchild) +1; }
【选做内容】
(1) 对二叉树进行层次遍历算法。

(2) 求二叉树的深度、宽度等操作。

(3) 复制二叉树,交换二叉树中左右子树的问题怎么实现? 内容2:哈夫曼编码/译码器
【问题描述】设字符集为26个英文字母,其出现频度如下表所示。

先建哈夫曼树,再利用此树对报文“This program is my favorite”进行编码和译码。

51 48 1 15 63 57 20 32 5 1 频度
z y x w v u t 字符
1 16
1
18
8
23
80
频度
p 21 f q
15 g r 47 h s o n m l k j 字符 57 103 32 22 13 64 186 频度 i e d c b a 空格
字符
【基本要求】
算法具有以下功能:
(1)CreateHuffmanTree:根据给定字符的出现频数,建立其哈夫曼树。

(2)Encoding:对给定的原字符串进行编码。

(3)Decoding:对给定的编码串进行译码(或解码)。

(4)ShowHuffmanTree:显示哈夫曼树
【实现提示】
(1)用户界面可设计成模拟菜单方式。

(2)原字符串及编码串可从键盘输入。

(3)生成Huffman树的步骤如下:
①由给定的n 个权值{w1, w2, …, wn}构成n棵二叉树的集合(即森林)F =
{ T1, T2, …, Tn },其中每棵二叉树Ti 中只有一个带权为wi 的根结点,
其左右子树均空。

②在 F 中选取两棵根结点的权值最小的树做为左右子树构造一棵新的二叉
树,且置新的二叉树的根结点的权值为其左右子树上根结点的权值之和。

③在F 中删去这两棵树,同时将新得到的二叉树加入F中。

④重复②和③, 直到 F 只含一棵树为止。

这棵树便是赫夫曼树。

【选做内容】
(1)字符的出现频数能否从指定文件中统计而得?
(2)对指定的文件进行编码/解码。

3。

相关文档
最新文档