二叉树实验报告Word格式.docx

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

二叉树实验报告Word格式.docx

《二叉树实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《二叉树实验报告Word格式.docx(15页珍藏版)》请在冰点文库上搜索。

二叉树实验报告Word格式.docx

(1)建立头文件InThread.h如下:

typedefstructNode

{

DataTypedata;

/*数据元素*/

intleftThread;

/*左线索*/

structNode*leftChild;

/*左指针*/

structNode*rightChild;

/*右指针*/

intrightThread;

/*右线索*/

}ThreadBiNode;

 

/*===================================*/

/*把一颗二叉树进行中序线索化的函数为CreatInThread(),*/

/*该函数把头结点进行了中序线索化,其余部分的中序线索化*/

/*是通过调用InThread()函数实现的。

InThread()是一个递归*/

/*函数。

*/

voidInThread(ThreadBiNode*current,ThreadBiNode**pre)

/*中序线索化二叉树*/

/*current为当前结点的指针,pre为当前结点的中序前驱结点指针*/

if(current!

=NULL)

{

InThread(current->

leftChild,pre);

/*中序线索化左子树*/

if(current->

leftChild==NULL)

current->

leftThread=1;

/*建立左线索标记*/

leftChild=*pre;

/*建立左线索指针*/

}

elsecurrent->

leftThread=0;

rightChild!

rightThread=0;

rightThread=1;

if((*pre)->

rightChild==NULL)

(*pre)->

/*建立右线索标记*/

rightChild=current;

/*建立右线索指针*/

*pre=current;

/*前序结点指针等于当前结点指针*/

rightChild,pre);

/*中序线索化右子树*/

}

/*============================*/

/*创建中序线索化二叉树*/

voidCreatInThread(ThreadBiNode**root)

/*创建中序线索化二叉树tree*/

ThreadBiNode*t=*root;

/*保存原二叉树根结点指针*/

ThreadBiNode*current,*pre=*root;

/*建立头结点*/

*root=(ThreadBiNode*)malloc(sizeof(ThreadBiNode));

if(t==NULL)/*当二叉树为空时*/

(*root)->

leftChild=*root;

rightChild=*root;

else/*当二叉树为非空时*/

current=t;

leftChild=t;

/*置头结点左指针*/

/*置头结点的左线索*/

InThread(current,&

pre);

/*线索化二叉树*/

pre->

/*置最后一个结点的右指针*/

/*置最后一个结点的右线索*/

rightChild=pre;

/*置头结点的右指针*/

/*置头结点的右线索*/

typedefstruct

ThreadBiNode*root;

/*头指针*/

ThreadBiNode*current;

/*当前结点指针*/

intnextComplete;

/*遍历结束标记*/

}ThreadBiTree;

/*初始化中序线索二叉树*/

voidThreadInitiate(ThreadBiTree*tree,ThreadBiNode*root)

/*初始化中序线索二叉树*/

tree->

root=root;

current=root;

if(root==NULL)

nextComplete=1;

else

nextComplete=0;

/*使中序线索二叉树tree的当前结点指针指向中序遍历的第一个结点*/

voidFirst(ThreadBiTree*tree)

/*使中序线索二叉树tree的当前结点指针指向中序遍历的第一个结点*/

current=tree->

root;

while(tree->

current->

leftThread==0)

leftChild;

if(tree->

current==tree->

root)tree->

elsetree->

/*使中序线索二叉树tree的当前结点指针指向中序遍历的下一个结点*/

voidNext(ThreadBiTree*tree)

/*使中序线索二叉树tree的当前结点指针指向中序遍历的下一个结点*/

ThreadBiNode*p=tree->

rightChild;

nextComplete==1)return;

rightThread==0)

while(p->

leftThread==0)p=p->

current=p;

/*判断是否已到中序线索二叉树尾部函数*/

intEndOfNext(ThreadBiTree*tree)

/*如中序线索二叉树tree的nextComplete域值等于1,则表示已到尾部*/

returntree->

nextComplete;

(2)建立主函数程序为:

#include<

stdio.h>

stdlib.h>

malloc.h>

typedefcharDataType;

#include"

InThread.h"

ThreadBiNode*GetTreeNode(DataTypeitem,ThreadBiNode*left,ThreadBiNode*right)

ThreadBiNode*p;

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

p->

data=item;

leftChild=left;

rightChild=right;

returnp;

voidMakeCharTree(ThreadBiNode**root)

ThreadBiNode*b,*c,*d,*e,*f,*g,*h;

g=GetTreeNode('

G'

NULL,NULL);

d=GetTreeNode('

D'

e=GetTreeNode('

E'

g,NULL);

b=GetTreeNode('

B'

d,e);

h=GetTreeNode('

H'

f=GetTreeNode('

F'

NULL,h);

c=GetTreeNode('

C'

f,NULL);

*root=GetTreeNode('

A'

b,c);

voidmain(void)

ThreadBiTreetree;

MakeCharTree(&

root);

CreatInThread(&

printf("

Binarytreetraversesequenceinorderis:

"

);

ThreadInitiate(&

tree,root);

for(First(&

tree);

!

EndOfNext(&

Next(&

tree))

%c"

tree.current->

data);

\n"

Thisprogramismadeby10273206!

}

运行结果为:

7-24

(1)建立头文件Haffman.h如下:

哈夫曼树的构造:

intweight;

intflag;

intparent;

intleftChild;

intrightChild;

}HaffNode;

intbit[MaxN];

intstart;

}Code;

voidHaffman(intweight[],intn,HaffNodehaffTree[])

inti,j,m1,m2,x1,x2;

for(i=0;

i<

2*n-1;

i++)

if(i<

n)haffTree[i].weight=weight[i];

elsehaffTree[i].weight=0;

haffTree[i].parent=-1;

haffTree[i].flag=0;

haffTree[i].leftChild=-1;

haffTree[i].rightChild=-1;

n-1;

m1=m2=MaxValue;

x1=x2=0;

for(j=0;

j<

n+i;

j++)

if(haffTree[j].weight<

m1&

&

haffTree[j].flag==0)

m2=m1;

x2=x1;

m1=haffTree[j].weight;

x1=j;

elseif(haffTree[j].weight<

m2&

m2=haffTree[j].weight;

x2=j;

haffTree[x1].parent=n+i;

haffTree[x2].parent=n+i;

haffTree[x1].flag=1;

haffTree[x2].flag=1;

haffTree[n+i].weight=haffTree[x1].weight+haffTree[x2].weight;

haffTree[n+i].leftChild=x1;

haffTree[n+i].rightChild=x2;

哈夫曼编码的函数:

voidHaffmanCode(HaffNodehaffTree[],intn,CodehaffCode[])

{

Code*cd=(Code*)malloc(sizeof(Code));

inti,j,child,parent;

n;

cd->

start=n-1;

weight=haffTree[i].weight;

child=i;

parent=haffTree[i].parent;

while(parent!

=-1)

if(haffTree[parent].leftChild==child)

bit[cd->

start]=0;

start]=1;

start--;

child=parent;

parent=haffTree[child].parent;

for(j=cd->

start+1;

haffCode[i].bit[j]=cd->

bit[j];

haffCode[i].start=cd->

haffCode[i].weight=cd->

weight;

(2)运行的程序:

#defineMaxValue10000

#defineMaxBit10

#defineMaxN100

Haffman.h"

inti,j,n=4;

intweight[]={1,3,5,7};

HaffNode*myHaffTree=(HaffNode*)malloc(sizeof(HaffNode)*(2*n+1));

Code*myHaffCode=(Code*)malloc(sizeof(Code)*n);

if(n>

MaxN)

Error!

exit(0);

Haffman(weight,n,myHaffTree);

HaffmanCode(myHaffTree,n,myHaffCode);

Weight=%dCode="

myHaffCode[i].weight);

for(j=myHaffCode[i].start;

%d"

myHaffCode[i].bit[j]);

\n"

Thisprogramismadeby10273206\n"

(3)第一步:

第二步:

第三步:

第四步:

总结与思考:

明白了图文并茂的形象,二叉树让我更好地理解程序代码。

熟悉了二叉树结点的结构和对二树的基本操作,熟练的掌握二叉树的先序递归遍历、中序递归和非递归遍历、后序递归遍历常用遍历方法,掌握了哈夫曼树的构造方法及哈夫曼编码。

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

当前位置:首页 > 经管营销 > 金融投资

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

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