数据结构实验四.docx
《数据结构实验四.docx》由会员分享,可在线阅读,更多相关《数据结构实验四.docx(13页珍藏版)》请在冰豆网上搜索。
数据结构实验四
贵州大学实验报告
学院:
计信学院专业:
通信工程班级:
通信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;ip->data=pre[i];
for(j=0;jpre[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;ib[i]=newBTreeNode;
b[i]->data=a[i];
b[i]->left=b[i]->right=NULL;
}
for(i=1;iintk1=-1,k2;
for(j=0;jif(b[j]!
=NULL&&k1==-1){
k1=j;
continue;
}
if(b[j]!
=NULL){
k2=j;
break;
}
}
for(j=k2;jif(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;icout<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
请按任意键继续...
实验总结
通过本次试验,是我熟悉和基本掌握了二叉树结点的结构和对二叉树的基本操作及具体实现。
为以后更进一步的学习打下了基础。
指导教师意见
签名:
年月日