实验六树.docx

上传人:b****1 文档编号:15216456 上传时间:2023-07-02 格式:DOCX 页数:13 大小:74.66KB
下载 相关 举报
实验六树.docx_第1页
第1页 / 共13页
实验六树.docx_第2页
第2页 / 共13页
实验六树.docx_第3页
第3页 / 共13页
实验六树.docx_第4页
第4页 / 共13页
实验六树.docx_第5页
第5页 / 共13页
实验六树.docx_第6页
第6页 / 共13页
实验六树.docx_第7页
第7页 / 共13页
实验六树.docx_第8页
第8页 / 共13页
实验六树.docx_第9页
第9页 / 共13页
实验六树.docx_第10页
第10页 / 共13页
实验六树.docx_第11页
第11页 / 共13页
实验六树.docx_第12页
第12页 / 共13页
实验六树.docx_第13页
第13页 / 共13页
亲,该文档总共13页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

实验六树.docx

《实验六树.docx》由会员分享,可在线阅读,更多相关《实验六树.docx(13页珍藏版)》请在冰点文库上搜索。

实验六树.docx

实验六树

实验六--树

实验六树

一.

1、参考工程shiyan6_1,请将其完善以实现树的基本运算。

若有一二叉树的括号表示为:

A(B(D,E(H(J,K(L,M(,N))),)),C(F,G(,I)))。

设计一个主程序实现如下功能,

(1)用二叉链表创建这棵二叉树T。

(2)输出二叉树T。

(3)分别输出二叉树T的先序、中序和后序遍历的序列。

(4)输出‘H’结点的左、右孩子结点值。

(5)输出二叉树T的深度。

(6)输出二叉树T的宽度。

(7)输出二叉树T的结点个数。

(8)输出二叉树T的叶子结点个数。

 

2【运行代码】

 

#define_Bitree_head

#include

usingnamespacestd;

typedefcharTElemType;

#defineMaxSize100

typedefstructBiTNode

{

TElemTypedata;

structBiTNode*lchild,*rchild;

}BiTNode,*BiTree;

intCreateBiTree(BiTree&T,char*str);

voidPreOrder(BiTNode*b);

BiTNode*FindNode(BiTNode*T,TElemTypex);

voidDispBiTNode(BiTNode*T);

intBiTNodeDepth(BiTNode*T);

intBiTNodeWidth(BiTNode*T);

intBiTNodes(BiTNode*T);

#endif

 

BiTNode*FindNode(BiTNode*T,TElemTypex)

{

BiTNode*p;

if(T==NULL)

returnNULL;

elseif(T->data==x)

returnT;

else

{

p=FindNode(T->lchild,x);

if(p!

=NULL)

returnp;

else

returnFindNode(T->rchild,x);

}

}

voidDispBiTNode(BiTNode*T)

{

if(T!

=NULL)

{

cout<data;

if(T->lchild!

=NULL||T->rchild!

=NULL)

{

cout<<'(';

DispBiTNode(T->lchild);

cout<<',';

DispBiTNode(T->rchild);

cout<<')';

}

}

}

 

intBiTNodeDepth(BiTNode*T)

{

intldepth,rdepth;

if(T==NULL)

return(0);

else

{

ldepth=BiTNodeDepth(T->lchild);

rdepth=BiTNodeDepth(T->rchild);

return(ldepth>rdepth)?

(ldepth+1):

(rdepth+1);

}

}

intBiTNodeWidth(BiTNode*T)/*求¨®二t叉?

树º¡Âb的Ì?

宽¨ª度¨¨*/

{

struct

{

intlno;/*结¨¢点Ì?

的Ì?

层?

次ä?

编À¨¤号?

*/

BiTNode*p;/*结¨¢点Ì?

指?

针?

*/

}Qu[MaxSize];/*定¡§义°?

顺3序¨°非¤?

循-环¡¤队¨®列¢D*/

intfront,rear;/*定¡§义°?

队¨®首º¡Á和¨ª队¨®尾2指?

针?

*/

intlnum,max,i,n;

front=rear=0;/*置?

队¨®列¢D为a空?

队¨®*/

if(T!

=NULL)

{

rear++;

Qu[rear].p=T;/*根¨´结¨¢点Ì?

指?

针?

入¨?

队¨®*/

Qu[rear].lno=1;/*根¨´结¨¢点Ì?

的Ì?

层?

次ä?

编À¨¤号?

为a1*/

while(rear!

=front)/*队¨®列¢D不?

为a空?

*/

{

front++;

T=Qu[front].p;/*队¨®头ª¡¤出?

队¨®*/

lnum=Qu[front].lno;

if(T->lchild!

=NULL)/*左Á¨®孩¡é子Á¨®入¨?

队¨®*/

{

rear++;

Qu[rear].p=T->lchild;

Qu[rear].lno=lnum+1;

}

if(T->rchild!

=NULL)/*右®¨°孩¡é子Á¨®入¨?

队¨®*/

{

rear++;

Qu[rear].p=T->rchild;

Qu[rear].lno=lnum+1;

}

}

max=0;lnum=1;i=1;

while(i<=rear)

{

n=0;

while(i<=rear&&Qu[i].lno==lnum)

{

n++;i++;

}

lnum=Qu[i].lno;

if(n>max)max=n;

}

returnmax;

}

else

return0;

}

intBiTNodes(BiTNode*T)/*求¨®二t叉?

树º¡Âb的Ì?

结¨¢点Ì?

个?

数ºy*/

{

intnum1,num2;

if(T==NULL)

return0;

elseif(T->lchild==NULL&&T->rchild==NULL)

return1;

else

{

num1=BiTNodes(T->lchild);

num2=BiTNodes(T->rchild);

return(num1+num2+1);

}

}

 

3【运行截图】

 

 

二.

1、编写工程shiyan6_2,实现构造一棵哈夫曼树,输出对应的哈夫曼编码和译码的算法。

并对下表的数据进行验证。

单词

The

of

a

to

and

in

that

he

is

at

on

for

His

are

be

出现频度

1192

677

541

518

462

450

242

195

190

181

174

157

138

124

123

2【运行代码】

 

#include"stdafx.h"

#include

#include

#defineN50

#defineMN*2-1

typedefstruct

{

chardata[5];

intweight;

intparent,lchild,rchild;

}HTNode;

typedefstruct

{

charcd[N];

intstart;

}HCode;

voidCreateHT(HTNodeht[],intn)

{

inti,k,lnode,rnode;

intmin1,min2;

for(i=0;i<2*n-1;i++)

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

for(i=n;i<2*n-1;i++)

{

min1=min2=32767;

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=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++;//

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);

}

intmain()

{

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];

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");

return0;

}。

 

【运行结果截图】

 

三【个人总结】

 

每次编程的时候都是一种煎熬,编的时候写代码改错。

调试,尤其在调试的时候,会让你原本很好的心情一下子会变得很糟很糟,一次一次的调一次一次的不给运行,真的有想把电脑砸了的冲动,但我还是静下心来一次一次的调试一次一次的改错,忍着既然选择了这条路

就应该坚持下去,再苦再累也要坚持,不抛弃不放弃只要坚持总有一天会成功的,在一次一次的调试几乎绝望的时候当突然看到看个黑色屏幕时心情,一下子就豁然了,一切一切的付出都值得,编完收拾东西吃出好好的奖励自己一下,好好的吃一顿,付出的一切都值得,只要坚持,不抛弃不放弃就一定能成功。

 

胜利属于坚持的人!

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

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2