实验报告二叉树Word格式文档下载.docx

上传人:b****6 文档编号:19128146 上传时间:2023-01-04 格式:DOCX 页数:8 大小:49.70KB
下载 相关 举报
实验报告二叉树Word格式文档下载.docx_第1页
第1页 / 共8页
实验报告二叉树Word格式文档下载.docx_第2页
第2页 / 共8页
实验报告二叉树Word格式文档下载.docx_第3页
第3页 / 共8页
实验报告二叉树Word格式文档下载.docx_第4页
第4页 / 共8页
实验报告二叉树Word格式文档下载.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

实验报告二叉树Word格式文档下载.docx

《实验报告二叉树Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《实验报告二叉树Word格式文档下载.docx(8页珍藏版)》请在冰豆网上搜索。

实验报告二叉树Word格式文档下载.docx

树:

树(tree)是n(n>

0)个结点的有限集T,其中,有且仅有一个特定的结点,称为树的根(root)。

当n>

1时,其余结点可分为

m(m>

0个互不相交的有限集T1,T2,……Tn,其中每一个集合本

身又是一棵树,称为根的子树(subtree)

二叉树:

二叉树是n(n>

=0)个结点的有限集,它或为空树(n=0),

或由一个根结点和两棵分别称为左子树和右子树的互不相交的

二叉树构成。

哈夫曼树:

最优二叉树——赫夫曼树设有n个权值

{w1,w2,wn},构造一棵有n个叶子结点的二叉树,每个叶

子的权值为wi,则wpl最小的二叉树叫Huffman树。

2.特点:

树中至少有一个结点——根

树中各子树是互不相交的集合

每个结点至多有二棵子树(即不存在度大于2的结点)

二叉树的子树有左、右之分,且其次序不能任意颠倒

一棵有n个叶子结点的Huffman树有2n-1个结点

采用顺序存储结构——动态分配数组存储

3.表示:

遍历二叉树:

先序遍历:

先访问根结点,然后分别先序遍历左子树、右子

中序遍历:

先中序遍历左子树,然后访问根结点,最后中序

遍历右子树

后序遍历:

先后序遍历左、右子树,然后访问根结点

按层次遍历:

从上到下、从左到右访问各结点

构造Huffman树的方法Huffman算法

(1)根据给定的n个权值{w1,w2,wn},构造n棵只有根结点的二叉树,令起权值为wj;

(2)在森林中选取两棵根结点权值最小的树作左右子树构造一棵新的二叉树,置新二叉树根结点权值为其左右子树根结点权值之和;

(3)在森林中删除这两棵树,同时将新得到的二叉树加入森林中重复上述两步,直到只含一棵树为止,这棵树即哈夫曼树。

4.实验内容和要求:

(1)二叉树

建立如下图所示的二叉树:

要求:

2

树;

3、用户可由键盘输入数据实现对二叉树各结点的插入、

删除等操作;

4、打印二叉树;

5、对二叉树实现前序、中序、后序遍历;

算法思想:

建立一棵只有头结点的二叉树,并通过调用插入左子树和插入右子树操作,依次将上图中的结点插入二叉树中,利用二叉树的特殊中序遍历方法将该树以凹入表示法打印显示。

最后,调用二叉树的前序、中序、后序遍历函数对二叉树进行遍历,并显示遍历结果。

⑵、哈夫曼树

设有字符集{A、B、CD},各字符在电文中出现的次数集为{1,3,5,7},设计各字符的哈夫曼编码。

要求:

1、构造字符集的哈夫曼树,其结点数据结构如下:

weight

flag

parent

leftChild

rightChild

2、由哈夫曼树构造哈夫曼编码,输出权值及其对应的编码。

算法思想:

首先,由给定的n个权值构造有2n-1个结点的哈夫曼树。

在哈夫曼树中,其叶结点的权值为相应的给定权值,非叶结点的权值为其孩子结点的权值之和。

哈夫曼树构造过程如下:

1.根据给定的n个权值{wi,驱,…,w},构成的n棵二叉

树的森林F={T1,T2,…,Tn},其中每棵二叉树Ti中只有一个权值为wi的结点,其左、右子树均为空;

2.在F中选取根结点的权值最小和次小的两棵树作为左、右子树构造一棵新的二叉树,且置新二叉树的根结点的权值为其左、右子树上根结点的权值之和;

3.在F中删除这两棵二叉树,并将新二叉树加入到F中;

4.重复2和3,直到F中只含一棵树为止。

这棵树就是哈夫曼树。

其次,对n个结点的哈夫曼树进行不等长编码。

保证任何一个字符的哈夫曼编码不为另一字符的哈夫曼编码的前缀。

、实验过程:

实验中的关键语句:

前序遍历中序遍历什么的都是一个道理,只是输出的时候的

顺序不同,都是先访问左孩子或者右孩子后在访问另一边

(1)先序遍历二叉树T的递归算法

StatusPreOrderTraverse(BiTreeT,Status(*Visit)(ElemType)){

StatusPrintElement(ElemTypee){

printf(e);

returnOK;

}

PreOrderTraverse(T,PrintElement);

if(T){

if(Visit(T->

data))

if(PreOrderTraverse(T->

lchild,Visit))

rchild,Visit))returnOK;

returnERROR;

}elsereturnOK;

}eight=a[i];

HTree[i].lchild=-1;

HTree[i].rchild=-1;

HTree[i].parent=-1;

staticintk=0;

intbb[1000];

staticinty;

intmin=1000;

for(intjj=0;

jj<

n;

jj++)

{

if(HTree[jj].weight<

min)

{min=HTree[jj].weight;

x=jj;

bb[k]=x;

k++;

int_min=1000;

for(intjjj=0;

jjj<

jjj++)

intkk;

for(kk=0;

kk<

k;

kk++)

if(jjj==bb[kk])

kk=k+2;

if(kk==k)

if(HTree[jjj].weight>

=HTree[x].weight)

if(HTree[jjj].weight<

_min)

{_min=HTree[jjj].weight;

y=jjj;

}

bb[k]=y;

HTree[x].parent=HTree[y].parent=n;

HTree[n].weight=HTree[x].weight+HTree[y].weig

ht;

HTree[n].lchild=x;

HTree[n].rchild=y;

HTree[n].parent=-1;

for(intii=n+1;

ii<

2*n-1;

ii++){min=1000;

ii;

if(jj==bb[kk])

if(HTree[jj].weight>

=HTree[y].weight)

min=HTree[jj].weight;

x=jj;

if(jjj==bb[kk])kk=k+2;

_min=HTree[jjj].weight;

HTree[x].parent=HTree[y].parent=ii;

ght;

HTree[ii].weight=HTree[x].weight+HTree[y].wei

HTree[ii].lchild=x;

HTree[ii].rchild=y;

HTree[ii].parent=-1;

编写及调试程序中遇到的问题及解决方法:

1)执行程序时程序停止运行

解决:

看到程序停止运行,推测可能的原因:

遇到死循环、参数设置不合理或者结构体没有造好。

首先对结构体进行了检查,各个成员声明正常无误,在对程序进行调试,程序正常跳出循环,因此最可能是自定义函数的参数设置的不合理,因此对调用的自定义函数进行相应的改动,将参数由具体类型改为指针类型后,程序正常运行。

(2)程序不停的输出同一个结点的数据。

分析运行结果可知,第一不停的输出证明遇到了死循环,第二输出的是同一个结点的数据,表示指针没有按预期进行指向,首先对程序进行调试,发现程序没有添加循环结束条件,添加循环结束条件后,只能输出树的部分结点的数据,对标志位进行修改后,程序运行正常,也能正确输出遍历结果。

实验总结:

1.实验结果及分析:

运行结果显示可以实现实验要求。

2.实验总结:

遍历二叉树首先有三种方法,即先序遍历,中序遍历和后序遍历。

递归方法比较简单,首先获得结点指针如果指针不为空,且有左子,从左子递归到下一层,如果没有左子,从右子递归到下一层,如果指针为空,则结束一层递归调用。

直到递归全部结束。

非递归如程序主要语言中所示

3.思考题:

已知一棵二叉树的层序序列是ABCDEFGH中序序列

是DBGEHJAC试画出此二叉树。

A

/

BC

/\

DEF

/\/

GHI

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1