数据结构实验四.docx

上传人:b****8 文档编号:29323160 上传时间:2023-07-22 格式:DOCX 页数:13 大小:17.64KB
下载 相关 举报
数据结构实验四.docx_第1页
第1页 / 共13页
数据结构实验四.docx_第2页
第2页 / 共13页
数据结构实验四.docx_第3页
第3页 / 共13页
数据结构实验四.docx_第4页
第4页 / 共13页
数据结构实验四.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

数据结构实验四.docx

《数据结构实验四.docx》由会员分享,可在线阅读,更多相关《数据结构实验四.docx(13页珍藏版)》请在冰豆网上搜索。

数据结构实验四.docx

数据结构实验四

贵州大学实验报告

学院:

计信学院专业:

通信工程班级:

通信091

姓名

何川

学号

0908060235

实验组

实验时间

2011.12、

指导教师

陈静

成绩

实验项目名称

二叉树操作

实验目的

1、熟悉二叉树结点的结构和对二叉树的基本操作及具体实现。

2、利用递归方法编写对二叉树的各种遍历算法。

3、掌握递归方法在二叉树中的使用。

实验要求

1、认真阅读和掌握本实验内容所给的全部程序。

2、在VisualC++6.0集成开发环境下编写和调试所有程序。

3、编写的所有算法须给出测试函数,并自行设计测试数据,对算法进行测试。

4、保存和打印出程序运行结果,并结合程序进行分析。

5、按照你对二叉树操作的需要,重新改写主文件并运行,打印出主文件清单

和运行结果。

实验原理

VisualC++的编译环境下,独立完成实验要求的内容,独立完成编写、编以

运行。

实验仪器

安装了VC++6.0的PC机

实验步骤

1、实现二叉树结点的定义和操作。

该程序包括一个头文件,用来存储定义二叉树结构类型以及对二叉树进行各种操作的函数声明;第二个为操作的实现文件,用来存储每一种操作的具体函数定义以及主函数。

二叉树的操作包括二叉树初始化、创建二叉树,判断二叉树是否为空,求二叉树的深度和结点数,遍历二叉树等。

2、已知二叉树的前序遍历序列和中序遍历序列,编写可唯一确定该二叉树的算法。

3、根据所给的n个带权叶子结点,编写算法构造哈夫曼树和哈夫曼编码。

实验内容

(1)typedefcharElemType;

structBTreeNode{

ElemTypedata;

BTreeNode*left;

BTreeNode*right;

};

voidInitBTree(BTreeNode*&BT);

voidCreatBTree(BTreeNode*&BT,char*a);

boolEmptyBTree(BTreeNode*BT);

voidTraverseBTree(BTreeNode*BT);

intBTreeDepth(BTreeNode*BT);

intBTreeCount(BTreeNode&BT);

voidPrintBTree(BTreeNode*BT);

#include

#include

usingnamespacestd;

voidInitBTree(BTreeNode*&BT){

BT=NULL;

}

voidCreatBTree(BTreeNode*&BT,char*a){

constintMaxSize=100;

BTreeNode*s[MaxSize];

inttop=-1;

BT=NULL;

BTreeNode*p;

intk;

inti=0;

while(a[i]){

switch(a[i]){

case'':

break;

case'(':

if(top==MaxSize-1){

cout<<"栈空间不够,请重新分配栈空间!

"<

exit

(1);

}

top++;

s[top]=p;

k=1;

break;

case')':

if(top==-1){

cout<<"二叉树广义表字符串错!

"<

exit

(1);

}

top--;

break;

case',':

k=2;

break;

default:

p=newBTreeNode;

p->data=a[i];

p->left=p->right=NULL;

if(BT==NULL)

BT=p;

else{

if(k==1)

s[top]->left=p;

else

s[top]->right=p;

}

}

i++;

}

}

boolEmptyBTree(BTreeNode*BT){

returnBT==NULL;

}

voidTraverseBTree(BTreeNode*BT){

if(BT!

=NULL){

cout<data<<'';

TraverseBTree(BT->left);

TraverseBTree(BT->right);

}

}

intBTreeDepth(BTreeNode*BT){

if(BT==NULL)

return0;

else

{

inti=BTreeDepth(BT->left);

intj=BTreeDepth(BT->right);

if(i>j)

returni+1;

else

returnj+1;

}

}

intBTreeCount(BTreeNode*BT){

if(BT==NULL)

return0;

else

{

inti=BTreeCount(BT->left);

intj=BTreeCount(BT->right);

returni+j+1;

}

}

voidPrintBTree(BTreeNode*BT){

if(BT!

=NULL){

cout<data;

if(BT->left!

=NULL||BT->right!

=NULL){

cout<<'(';

PrintBTree(BT->left);

if(BT->right!

=NULL)

cout<<',';

PrintBTree(BT->right);

cout<<')';

}

}

}

voidmain(){

BTreeNode*bt;

InitBTree(bt);

charb[50]="A(B(C),D(E(F,G),H(,I)))";

CreatBTree(bt,b);

PrintBTree(bt);

cout<

cout<<"前序:

";

TraverseBTree(bt);

cout<

cout<<"二叉树的深度为:

";

cout<

cout<<"二叉树的结点总数为:

";

cout<

}

BTreeNode*PreMinCreateTree(charpre[],charmin[],BTreeNode*&p,inti,intj,intlen){

BTreeNode*p,*q;

for(i=0;i

p->data=pre[i];

for(j=0;j

pre[i]==min[j];

p->left=pre[i+1];

}

(2)typedefcharElemType;

structBTreeNode{

ElemTypedata;

BTreeNode*left;

BTreeNode*right;

};

BTreeNode*PreMinCreateTree(charpre[],charmin[],BTreeNode*&p,inti,intj,intlen);

intPosition(ElemTypex,chara[]);

voidPrintBTree(BTreeNode*BT);

#include"PreMinCreateTree.h"

#include

#include

usingnamespacestd;

intPosition(ElemTypex,chara[]){

inti;

for(i=0;i<8;i++)

if(x==a[i])

returni;

}

BTreeNode*PreMinCreateTree(charpre[],charmin[],BTreeNode*&p,inti,intj,intlen){

intm,leftlen,rightlen;

if(len<=0)

p=NULL;

else{

p=newBTreeNode;

p->data=pre[i];

m=Position(pre[i],min);

leftlen=m-j;

rightlen=len-(leftlen+1);

PreMinCreateTree(pre,min,p->left,i+1,j,leftlen);

PreMinCreateTree(pre,min,p->right,i+leftlen+1,m+1,rightlen);

}

returnp;

}

voidPrintBTree(BTreeNode*BT){

if(BT!

=NULL){

cout<data;

if(BT->left!

=NULL||BT->right!

=NULL){

cout<<'(';

PrintBTree(BT->left);

if(BT->right!

=NULL)

cout<<',';

PrintBTree(BT->right);

cout<<')';

}

}

}

voidmain(){

charpre[]={'a','b','c','d','e','f','g','h'};

charin[]={'c','b','d','a','f','e','h','g'};

BTreeNode*p;

intprestart=0;

intpreend=7;

intinstart=0;

intinend=7;

BTreeNode*bt;

bt=PreMinCreateTree(pre,in,p,0,0,8);

PrintBTree(bt);

cout<

}

(3))typedefintElemType;

structBTreeNode{

ElemTypedata;

BTreeNode*left;

BTreeNode*right;

};

BTreeNode*CreateHuffman(ElemTypea[],intn);

voidHuffManCoding(BTreeNode*FBT,intlen);

ElemTypeWeightPathLength(BTreeNode*FBT,intlen);

voidPrintBTree(BTreeNode*BT);

#include"huffman.h"

#include

#include

usingnamespacestd;

typedefintElemType;

structBTreeNode{

ElemTypedata;

BTreeNode*left;

BTreeNode*right;

};

BTreeNode*CreateHuffman(ElemTypea[],intn){

BTreeNode**b,*q;

b=newBTreeNode*[n];

inti,j;

for(i=0;i

b[i]=newBTreeNode;

b[i]->data=a[i];

b[i]->left=b[i]->right=NULL;

}

for(i=1;i

intk1=-1,k2;

for(j=0;j

if(b[j]!

=NULL&&k1==-1){

k1=j;

continue;

}

if(b[j]!

=NULL){

k2=j;

break;

}

}

for(j=k2;j

if(b[j]!

=NULL){

if(b[j]->datadata)

{

k2=k1;

k1=j;

}

elseif(b[j]->datadata)k2=j;

}

}

q=newBTreeNode;

q->data=b[k1]->data+b[k2]->data;

q->left=b[k1];

q->right=b[k2];

b[k1]=q;

b[k2]=NULL;

}

delete[]b;

returnq;

}

ElemTypeWeightPathLength(BTreeNode*FBT,intlen){

if(FBT==NULL)return0;

else{

if(FBT->left==NULL&&FBT->right==NULL){

returnFBT->data*len;

}

else{

returnWeightPathLength(FBT->left,len+1)+WeightPathLength(FBT->right,len+1);

}

}

}

voidHuffManCoding(BTreeNode*FBT,intlen){

staticinta[10];

if(FBT!

=NULL){

if(FBT->left==NULL&&FBT->right==NULL){

cout<<"节点权值为"<data<<"的编码:

";

for(inti=0;i

cout<

cout<

}

else{

a[len]=0;

HuffManCoding(FBT->left,len+1);

a[len]=1;

HuffManCoding(FBT->right,len+1);

}

}

}

voidPrintBTree(BTreeNode*BT){

if(BT!

=NULL){

cout<data;

if(BT->left!

=NULL||BT->right!

=NULL){

cout<<'(';

PrintBTree(BT->left);

if(BT->right!

=NULL)

cout<<',';

PrintBTree(BT->right);

cout<<')';

}

}

}

voidmain(){

inti,n;

BTreeNode*fbt=NULL;

n=6;

ElemTypea[6]={3,9,5,12,6,15};

fbt=CreateHuffman(a,n);

cout<<"以广义表的形式输出哈夫曼树:

";

PrintBTree(fbt);

cout<

cout<<"哈夫曼树的权:

";

cout<

cout<<"树中每个叶子结点的哈夫曼编码:

"<

HuffManCoding(fbt,0);

}

实验数据

(1)A(B(C),D(E(F,G),H(,I)))

前序:

ABCDEFGHI

二叉树的深度为:

4

二叉树的结点总数为:

9

请按任意键继续...

(2)a(b(c,d),e(f,g(h)))

请按任意键继续...

(3)以广义表的形式输出哈夫曼树:

50(21(9,12),29(14(6,8(3,5)),15))

哈夫曼树的权:

122

树中每个叶子结点的哈夫曼编码:

节点权值为9的编码:

00

节点权值为12的编码:

01

节点权值为6的编码:

100

节点权值为3的编码:

1010

节点权值为5的编码:

1011

节点权值为15的编码:

11

请按任意键继续...

实验总结

通过本次试验,是我熟悉和基本掌握了二叉树结点的结构和对二叉树的基本操作及具体实现。

为以后更进一步的学习打下了基础。

指导教师意见

 

签名:

年月日

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

当前位置:首页 > 高等教育 > 经济学

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

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