数据结构实验 实现中序线索化二叉树 构造哈夫曼树Word文档下载推荐.docx
- 文档编号:18851425
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:10
- 大小:28.58KB
数据结构实验 实现中序线索化二叉树 构造哈夫曼树Word文档下载推荐.docx
《数据结构实验 实现中序线索化二叉树 构造哈夫曼树Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数据结构实验 实现中序线索化二叉树 构造哈夫曼树Word文档下载推荐.docx(10页珍藏版)》请在冰豆网上搜索。
实验题7.5实现中序线索化二叉树
/*文件名:
exp7-5.cpp*/
#include<
stdio.h>
malloc.h>
#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;
/*为左结点*/
)'
top--;
break;
'
k=2;
/*为右结点*/
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;
case2:
rchild=p;
}
}
}
j++;
ch=str[j];
}
}
voidDispTBTNode(TBTNode*b)
if(b!
=NULL)
printf("
%c"
b->
data);
if(b->
lchild!
=NULL||b->
rchild!
printf("
("
);
DispTBTNode(b->
lchild);
if(b->
=NULL)printf("
"
rchild);
)"
TBTNode*pre;
/*全局变量*/
voidThread(TBTNode*&
p)
if(p!
=NULL)
{
Thread(p->
/*左子树线索化*/
if(p->
lchild==NULL)/*前驱线索*/
lchild=pre;
/*建立当前结点的前驱线索*/
ltag=1;
elsep->
ltag=0;
if(pre->
rchild==NULL)/*后继线索*/
{
pre->
/*建立前驱结点的后继线索*/
rtag=1;
elsepre->
rtag=0;
pre=p;
/*右子树线索化*/
TBTNode*CreaThread(TBTNode*b)/*中序线索化二叉树*/
TBTNode*root;
root=(TBTNode*)malloc(sizeof(TBTNode));
/*创建根结点*/
root->
root->
rchild=b;
if(b==NULL)/*空二叉树*/
root->
lchild=root;
else
{
lchild=b;
pre=root;
/*pre是*p的前驱结点,供加线索用*/
Thread(b);
/*中序遍历线索化二叉树*/
pre->
rchild=root;
/*最后处理,加入指向根结点的线索*/
rchild=pre;
/*根结点右线索化*/
returnroot;
voidThInOrder(TBTNode*tb)
TBTNode*p=tb->
lchild;
/*指向根结点*/
while(p!
=tb)
while(p->
ltag==0)p=p->
%c"
p->
rtag==1&
&
p->
=tb)
p=p->
rchild;
p=p->
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);
线索中序序列:
ThInOrder(tb);
结果截图:
7.6构造哈夫曼树
exp7-6.cpp*/
string.h>
#defineN50/*叶子结点数*/
#defineM2*N-1/*树中结点总数*/
typedefstruct
chardata[5];
/*结点值*/
intweight;
/*权重*/
intparent;
/*双亲结点*/
intlchild;
/*左孩子结点*/
intrchild;
/*右孩子结点*/
}HTNode;
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++)/*构造哈夫曼树*/
min1=min2=32767;
/*lnode和rnode为最小权重的两个结点位置*/
lnode=rnode=-1;
for(k=0;
k<
=i-1;
k++)
if(ht[k].parent==-1)/*只在尚未构造二叉树的结点中查找*/
{
if(ht[k].weight<
min1)
{
min2=min1;
rnode=lnode;
min1=ht[k].weight;
lnode=k;
}
elseif(ht[k].weight<
min2)
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;
n;
i++)/*根据哈夫曼树求哈夫曼编码*/
hc.start=n;
c=i;
f=ht[i].parent;
while(f!
=-1)/*循序直到树根结点*/
if(ht[f].lchild==c)/*处理左孩子结点*/
hc.cd[hc.start--]='
0'
;
else/*处理右孩子结点*/
1'
c=f;
f=ht[f].parent;
hc.start++;
/*start指向哈夫曼编码最开始字符*/
hcd[i]=hc;
voidDispHCode(HTNodeht[],HCodehcd[],intn)
inti,k;
intsum=0,m=0,j;
输出哈夫曼编码:
/*输出哈夫曼编码*/
i++)
j=0;
%s:
\t"
ht[i].data);
for(k=hcd[i].start;
=n;
hcd[i].cd[k]);
j++;
m+=ht[i].weight;
sum+=ht[i].weight*j;
\n平均长度=%g\n"
1.0*sum/m);
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,195,190,181,174,157,138,124,123};
HTNodeht[M];
HCodehcd[N];
strcpy(ht[i].data,str[i]);
ht[i].weight=fnum[i];
CreateHT(ht,n);
CreateHCode(ht,hcd,n);
DispHCode(ht,hcd,n);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构实验 实现中序线索化二叉树 构造哈夫曼树 数据结构 实验 实现 线索 二叉 构造 哈夫曼树