大数据结构实验实现中序线索化二叉树构造哈夫曼树.docx

上传人:b****3 文档编号:3885118 上传时间:2022-11-26 格式:DOCX 页数:10 大小:28.90KB
下载 相关 举报
大数据结构实验实现中序线索化二叉树构造哈夫曼树.docx_第1页
第1页 / 共10页
大数据结构实验实现中序线索化二叉树构造哈夫曼树.docx_第2页
第2页 / 共10页
大数据结构实验实现中序线索化二叉树构造哈夫曼树.docx_第3页
第3页 / 共10页
大数据结构实验实现中序线索化二叉树构造哈夫曼树.docx_第4页
第4页 / 共10页
大数据结构实验实现中序线索化二叉树构造哈夫曼树.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

大数据结构实验实现中序线索化二叉树构造哈夫曼树.docx

《大数据结构实验实现中序线索化二叉树构造哈夫曼树.docx》由会员分享,可在线阅读,更多相关《大数据结构实验实现中序线索化二叉树构造哈夫曼树.docx(10页珍藏版)》请在冰豆网上搜索。

大数据结构实验实现中序线索化二叉树构造哈夫曼树.docx

大数据结构实验实现中序线索化二叉树构造哈夫曼树

 

实验报告

 

课程名称数据结构

实验项目名称实现中序线索化二叉树,构造哈夫曼树

班级与班级代码

实验室名称(或课室)SS1-204

专业软件工程

任课教师

学号:

姓名:

实验日期:

2011年11月18日

 

商学院教务处制

实验报告成绩

评价:

评价项目

一般

实验任务是否明确

实验步骤是否清晰详尽

实验任务是否完成

实验结果是否正确

程序设计是否规标准

版面整体效果是否美观

 

指导教师(签名)

2011年月日

说明:

指导教师评分后,实验报告交院(系)办公室保存。

实验题7.5实现中序线索化二叉树

/*文件名:

exp7-5.cpp*/

#include

#include

#defineMaxSize100

typedefcharElemType;

typedefstructnode

{

ElemTypedata;

intltag,rtag;/*增加的线索标记*/

structnode*lchild;

structnode*rchild;

}TBTNode;

voidCreateTBTNode(TBTNode*&b,char*str)

{

TBTNode*St[MaxSize],*p=NULL;

inttop=-1,k,j=0;

charch;

b=NULL;/*建立的二叉树初始时为空*/

ch=str[j];

while(ch!

='\0')/*str未扫描完时循环*/

{

switch(ch)

{

case'(':

top++;St[top]=p;k=1;break;/*为左结点*/

case')':

top--;break;

case',':

k=2;break;/*为右结点*/

default:

p=(TBTNode*)malloc(sizeof(TBTNode));

p->data=ch;p->lchild=p->rchild=NULL;

if(b==NULL)/**p为二叉树的根结点*/

b=p;

else/*已建立二叉树根结点*/

{

switch(k)

{

case1:

St[top]->lchild=p;break;

case2:

St[top]->rchild=p;break;

}

}

}

j++;

ch=str[j];

}

}

voidDispTBTNode(TBTNode*b)

{

if(b!

=NULL)

{

printf("%c",b->data);

if(b->lchild!

=NULL||b->rchild!

=NULL)

{

printf("(");

DispTBTNode(b->lchild);

if(b->rchild!

=NULL)printf(",");

DispTBTNode(b->rchild);

printf(")");

}

}

}

TBTNode*pre;/*全局变量*/

voidThread(TBTNode*&p)

{

if(p!

=NULL)

{

Thread(p->lchild);/*左子树线索化*/

if(p->lchild==NULL)/*前驱线索*/

{

p->lchild=pre;/*建立当前结点的前驱线索*/

p->ltag=1;

}

elsep->ltag=0;

if(pre->rchild==NULL)/*后继线索*/

{

pre->rchild=p;/*建立前驱结点的后继线索*/

pre->rtag=1;

}

elsepre->rtag=0;

pre=p;

Thread(p->rchild);/*右子树线索化*/

}

}

TBTNode*CreaThread(TBTNode*b)/*中序线索化二叉树*/

{

TBTNode*root;

root=(TBTNode*)malloc(sizeof(TBTNode));/*创建根结点*/

root->ltag=0;root->rtag=1;

root->rchild=b;

if(b==NULL)/*空二叉树*/

root->lchild=root;

else

{

root->lchild=b;

pre=root;/*pre是*p的前驱结点,供加线索用*/

Thread(b);/*中序遍历线索化二叉树*/

pre->rchild=root;/*最后处理,加入指向根结点的线索*/

pre->rtag=1;

root->rchild=pre;/*根结点右线索化*/

}

returnroot;

}

voidThInOrder(TBTNode*tb)

{

TBTNode*p=tb->lchild;/*指向根结点*/

while(p!

=tb)

{

while(p->ltag==0)p=p->lchild;

printf("%c",p->data);

while(p->rtag==1&&p->rchild!

=tb)

{

p=p->rchild;

printf("%c",p->data);

}

p=p->rchild;

}

}

voidmain()

{

TBTNode*b,*tb;

CreateTBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");

printf("二叉树:

");DispTBTNode(b);printf("\n");

tb=CreaThread(b);

printf("线索中序序列:

");ThInOrder(tb);printf("\n");

}

结果截图:

 

7.6构造哈夫曼树

/*文件名:

exp7-6.cpp*/

#include

#include

#defineN50/*叶子结点数*/

#defineM2*N-1/*树中结点总数*/

typedefstruct

{

chardata[5];/*结点值*/

intweight;/*权重*/

intparent;/*双亲结点*/

intlchild;/*左孩子结点*/

intrchild;/*右孩子结点*/

}HTNode;

typedefstruct

{

charcd[N];/*存放哈夫曼码*/

intstart;

}HCode;

voidCreateHT(HTNodeht[],intn)

{

inti,k,lnode,rnode;

intmin1,min2;

for(i=0;i<2*n-1;i++)/*所有结点的相关域置初值-1*/

ht[i].parent=ht[i].lchild=ht[i].rchild=-1;

for(i=n;i<2*n-1;i++)/*构造哈夫曼树*/

{

min1=min2=32767;/*lnode和rnode为最小权重的两个结点位置*/

lnode=rnode=-1;

for(k=0;k<=i-1;k++)

if(ht[k].parent==-1)/*只在尚未构造二叉树的结点中查找*/

{

if(ht[k].weight

{

min2=min1;rnode=lnode;

min1=ht[k].weight;lnode=k;

}

elseif(ht[k].weight

{

min2=ht[k].weight;rnode=k;

}

}

ht[lnode].parent=i;ht[rnode].parent=i;

ht[i].weight=ht[lnode].weight+ht[rnode].weight;

ht[i].lchild=lnode;ht[i].rchild=rnode;

}

}

voidCreateHCode(HTNodeht[],HCodehcd[],intn)

{

inti,f,c;

HCodehc;

for(i=0;i

{

hc.start=n;c=i;

f=ht[i].parent;

while(f!

=-1)/*循序直到树根结点*/

{

if(ht[f].lchild==c)/*处理左孩子结点*/

hc.cd[hc.start--]='0';

else/*处理右孩子结点*/

hc.cd[hc.start--]='1';

c=f;f=ht[f].parent;

}

hc.start++;/*start指向哈夫曼编码最开始字符*/

hcd[i]=hc;

}

}

voidDispHCode(HTNodeht[],HCodehcd[],intn)

{

inti,k;

intsum=0,m=0,j;

printf("输出哈夫曼编码:

\n");/*输出哈夫曼编码*/

for(i=0;i

{

j=0;

printf("%s:

\t",ht[i].data);

for(k=hcd[i].start;k<=n;k++)

{

printf("%c",hcd[i].cd[k]);

j++;

}

m+=ht[i].weight;

sum+=ht[i].weight*j;

printf("\n");

}

printf("\n平均长度=%g\n",1.0*sum/m);

}

voidmain()

{

intn=15,i;

char*str[]={"The","of","a","to","and","in","that","he","is","at","on","for","His","are","be"};

intfnum[]={1192,677,541,518,462,450,242,,190,181,174,157,,124,123};

HTNodeht[M];

HCodehcd[N];

for(i=0;i

{

strcpy(ht[i].data,str[i]);

ht[i].weight=fnum[i];

}

printf("\n");

CreateHT(ht,n);

CreateHCode(ht,hcd,n);

DispHCode(ht,hcd,n);

printf("\n");

}

结果截图:

 

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

当前位置:首页 > 工程科技 > 能源化工

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

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