树的实验报告1Word格式.docx

上传人:b****4 文档编号:18517855 上传时间:2022-12-18 格式:DOCX 页数:24 大小:83.55KB
下载 相关 举报
树的实验报告1Word格式.docx_第1页
第1页 / 共24页
树的实验报告1Word格式.docx_第2页
第2页 / 共24页
树的实验报告1Word格式.docx_第3页
第3页 / 共24页
树的实验报告1Word格式.docx_第4页
第4页 / 共24页
树的实验报告1Word格式.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

树的实验报告1Word格式.docx

《树的实验报告1Word格式.docx》由会员分享,可在线阅读,更多相关《树的实验报告1Word格式.docx(24页珍藏版)》请在冰豆网上搜索。

树的实验报告1Word格式.docx

voidPreleaf(BTreeroot);

先序求叶子节点个数

voidPrintfTree(BTreeroot,inth);

打印二叉树

intPostHeight(BTreeroot));

后序求树的深度

voidInitTree(BiTree*bt);

初始化树

intInitStack(Stack*top);

初始化栈

BiTnode*Create();

//扩展结点创建二叉树

intPush(Stack*top,BiTreep);

入栈

intPop(Stack*top,BiTree*p);

出栈

intGetTop(Stacktop,BiTreep);

取栈顶元素

voidPreStack(BTreeroot);

//非递归先序遍历

voidSelect(HTreeht,intpos/*寻找的范围*/,int*s1,int*s2)//查找最小的两个节点的下标

voidCreatHuffmanTree(HTreeht,intw[],intn)//创建哈夫曼树

voiOutput(HTreeht,intn)//输出哈夫曼树

voidCodeHuffmanTree(HTreeht,HCodehc,intn)//编码

voidOutputCode(HCodehc,intw[],intn)//输出编码

3、详细设计及运行结果

voidpreOrder(BiTreebt)//先序遍历。

{

if(bt!

=NULL)

{

printf("

%c"

bt->

data);

preOrder(bt->

LChild);

RChild);

}

}

voidInOrder(BiTreebt)//中序遍历。

InOrder(bt->

voidPostOrder(BiTreebt)//后序遍历。

PostOrder(bt->

voidTraver(BiTreebt)

intPostTreeDepth(BiTreebt)

inthl,hr,max;

hl=PostTreeDepth(bt->

hr=PostTreeDepth(bt->

max=hl>

hr?

hl:

hr;

return(max+1);

else

return0;

voidPreStack(BiTreebt)//非递归遍历

BiTreep;

LinkStacks;

InitStack(&

s);

//p=bt;

PushStack(s,bt);

while(!

Isempty(s))

PopStack(s,&

p);

printf("

p->

if(p->

RChild!

=NULL)

PushStack(s,p->

LChild!

PushStack(s,p->

}

/*

voidPreStack(BiTreebt)//非递归先序遍历

p=bt;

while(p||!

if(p)

{

PushStack(s,p);

p=p->

LChild;

else

PopStack(s,&

RChild;

}*/

voidPrintTree(BiTreebt,intnLayer)

inti;

if(bt==NULL)

return;

PrintTree(bt->

RChild,nLayer+1);

for(i=0;

i<

nLayer;

i++)

"

);

printf("

%c\n"

LChild,nLayer+1);

voidLeafTree(BiTreebt)//树的叶子结点遍历

if(bt->

LChild==NULL&

&

bt->

RChild==NULL)

LeafTree(bt->

voidTravel(BiTreebt)//树的按层遍历

LinkQueueQ;

InitQueue(&

Q);

EnterQueue(&

Q,p);

while(Q.front!

=Q.rear)

DeleteQueue(&

Q,&

if(p->

LChild)

EnterQueue(&

Q,p->

RChild)

2:

哈弗曼

voidCreat(HuffmanTreeht,intw[],charp[],intn)//构造哈弗曼树。

ints1,s2,i;

for(i=1;

=n;

i++)//前n个叶子结点的初始化

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

ht[i].parent=0;

ht[i].LChild=0;

ht[i].RChild=0;

for(i=n+1;

=2*n-1;

i++)//权值的初始化。

select(ht,i-1,&

s1,&

s2);

ht[i].weight=ht[s1].weight+ht[s2].weight;

ht[s1].parent=i;

ht[s2].parent=i;

ht[i].LChild=s1;

ht[i].RChild=s2;

//生成哈弗曼树的函数编码。

voidOrderHuffman(HuffmanTreeht,Huffmancodehc,charstr[],intm)//根据哈弗曼树构成哈弗曼编码表hc。

intq[N];

char*cd;

//临时存放编码串。

intc,p,i;

//c,p分别为孩子和双亲。

intstart;

//制定编码cd的起始位置。

cd=(char*)malloc(m*sizeof(char));

cd[m-1]='

\0'

;

//最后一位置放上字符串的结束标志。

i=0;

while(i<

m)

switch(str[i])

case'

s'

:

q[i]=3;

break;

t'

q[i]=4;

a'

q[i]=2;

e'

q[i]=6;

default:

break;

start=m-1;

c=q[i];

p=ht[q[i]].parent;

while(p!

=0)

--start;

if(ht[p].LChild==c)

cd[start]='

0'

//左孩子生成0

else//右孩子生成1

1'

c=p;

p=ht[p].parent;

hc[i]=(char*)malloc((m-start)*sizeof(char));

strcpy(hc[i],&

cd[start]);

%s"

hc[i]);

i++;

free(cd);

voidprint(HuffmanTreeht,intn)

%4d%4d%4d\n"

ht[i].weight,ht[i].LChild,ht[i].RChild);

4、调试情况,设计技巧及体会

1.对自己的设计进行评价,指出合理和不足之处,提出改进方案;

打印树状二叉树的模块没有能按照自然数的形式打印,有待改进。

2.对设计及调试过程的心得体会。

5、源程序清单(电子版)

建立一棵用二叉链表方式存储的二叉树,并对其进行遍历(先序、中序和后序),打印输出遍历结果。

1:

从键盘接受输入先序序列,以二叉链表作为存储结构,建立二叉树(以先序来建立),

2:

将此二叉树按照“树状形式”打印输出,

3:

对其进行遍历(先序、中序和后序),

4:

最后将遍历结果打印输出在遍历算法中

5:

要求至少有一种遍历采用非递归方法。

*/

#include<

stdio.h>

string.h>

stdlib.h>

#defineFALSE0

#defineTRUE1

typedefstructNode

chardata;

structNode*LChild;

structNode*RChild;

}BitNode,*BiTree;

typedefstructnod

BiTreeelem;

structnod*next;

}SeqStack,*LinkStack;

voidInitStack(LinkStack*top)

(*top)=(LinkStack)malloc(sizeof(SeqStack));

(*top)->

next=NULL;

intIsempty(LinkStacktop)

if(top->

next==NULL)

returnTRUE;

returnFALSE;

intPushStack(LinkStacktop,BiTreex)

LinkStacktemp;

temp=(SeqStack*)malloc(sizeof(SeqStack));

if(temp==NULL)

returnFALSE;

temp->

elem=x;

next=top->

next;

top->

next=temp;

returnTRUE;

intPopStack(LinkStacktop,BiTree*x)

temp=top->

*x=temp->

elem;

next=temp->

free(temp);

intCreatBiTree(BiTree*bt)//树的先序建立

charch;

ch=getchar();

if(ch=='

#'

*bt=NULL;

*bt=(BitNode*)malloc(sizeof(BitNode));

if(*bt==NULL)

return0;

(*bt)->

data=ch;

CreatBiTree(&

((*bt)->

LChild));

RChild));

return1;

typedefstructnode

BiTreew;

structnode*next;

}LinkNode;

typedefstruct

LinkNode*front;

LinkNode*rear;

}LinkQueue;

intInitQueue(LinkQueue*Q)

Q->

front=(LinkNode*)malloc(sizeof(LinkNode));

if(Q->

front!

Q->

rear=Q->

front;

front->

intEnterQueue(LinkQueue*Q,BiTreex)

LinkNode*NewNode;

NewNode=(LinkNode*)malloc(sizeof(LinkQueue));

if(NewNode!

NewNode->

w=x;

rear->

next=NewNode;

rear=NewNode;

intDeleteQueue(LinkQueue*Q,BiTree*x)

LinkNode*p;

front==Q->

rear)

p=Q->

next=p->

rear==p)

*x=p->

w;

free(p);

voidmain()

BiTreebt;

intnLayer;

CreatBiTree(&

bt);

nLayer=PostTreeDepth(bt);

树的深度:

%d\n"

nLayer);

树的树状打印:

\n"

PrintTree(bt,nLayer);

前序访问:

preOrder(bt);

中序访问:

InOrder(bt);

后序访问:

PostOrder(bt);

非递归访问:

PreStack(bt);

树的叶子结点有:

LeafTree(bt);

树的按层遍历:

Travel(bt);

//huffman

#defineN20

#defineM2*N-1

typedefchar*Huffmancode[N+1];

intweight;

intparent;

intLChild;

intRChild;

}HTNode,HuffmanTree[M+1];

//建立哈弗曼树的几个函数。

voidselect(HuffmanTreeht,intpos,int*s1,int*s2)//寻找最小孩子形成最优二叉树。

intm1,m2;

m1=m2=32767;

=pos;

if(ht[i].parent==0&

ht[i].weight<

m1)

m2=m1;

m1=ht[i].weight;

*s2=*s1;

*s1=i;

elseif(ht[i].parent==0&

m2)

m2=ht[i].weight;

*s2=i;

if(*s1>

*s2)

i=*s1;

*s1=*s2;

*s2=i;

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

当前位置:首页 > 初中教育 > 中考

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

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