2023年树的实验报告_第1页
2023年树的实验报告_第2页
2023年树的实验报告_第3页
2023年树的实验报告_第4页
2023年树的实验报告_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2023-2023学年第一学期数据结构课内实验报告学院:计算机学院专业:计算机科学与技术姓名:学号:指导老师:实验题目实验目的1.掌握二叉树的建立,递归遍历(先序,中序,后序),打印树状二叉树,计算叶子节点的个数。2.二叉树的非递归遍历3.掌握哈夫曼树的基本算法。实验内容1.树的递归与非递归遍历(1)从键盘接受输入先序序列,以二叉链表作为存储结构,建立二叉树(以先序来建立),(2)将此二叉树按照“树状形式”打印输出,(3)对其进行遍历(先序、中序和后序),(4)最后将遍历结果打印输出在遍历算法中(5)规定至少有一种遍历采用非递归方法2.哈夫曼基本规定:(1)从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树;(2)打印每一个字符相应的哈夫曼编码。(3)对从终端读入的字符串进行编码,并显示编码结果。四:模块化分各个模块具体的功能描述。voidPreOrder(BTreeroot);先序遍历voidInOrder(BTreeroot);中序遍历voidPostOrder(BTreeroot);后序遍历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)//输出编码具体设计及运营结果voidpreOrder(BiTreebt)ﻩ//先序遍历。{ﻩif(bt!=NULL) {ﻩﻩprintf("%c",bt->data);ﻩﻩpreOrder(bt->LChild); ﻩpreOrder(bt->RChild); }}voidInOrder(BiTreebt) //中序遍历。{ﻩif(bt!=NULL) {ﻩ InOrder(bt->LChild); ﻩprintf("%c",bt->data); ﻩInOrder(bt->RChild);ﻩ}}voidPostOrder(BiTreebt) //后序遍历。{ if(bt!=NULL)ﻩ{ ﻩPostOrder(bt->LChild); ﻩPostOrder(bt->RChild); ﻩprintf("%c",bt->data);ﻩ}}voidTraver(BiTreebt){ }intPostTreeDepth(BiTreebt){ﻩinthl,hr,max; if(bt!=NULL) { ﻩhl=PostTreeDepth(bt->LChild); ﻩhr=PostTreeDepth(bt->RChild); ﻩ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("%c",p->data); if(p->RChild!=NULL) PushStack(s,p->RChild);ﻩﻩﻩif(p->LChild!=NULL)ﻩﻩ ﻩPushStack(s,p->LChild); ﻩ}}/*voidPreStack(BiTreebt) //非递归先序遍历{ﻩBiTreep; LinkStacks; InitStack(&s);ﻩp=bt;ﻩwhile(p||!Isempty(s)) { if(p)ﻩ {ﻩ printf("%c",p->data); ﻩPushStack(s,p);ﻩ p=p->LChild; }ﻩ else { ﻩPopStack(s,&p);ﻩﻩ p=p->RChild; ﻩ}ﻩ}}*/voidPrintTree(BiTreebt,intnLayer){ inti; if(bt==NULL) ﻩreturn;ﻩPrintTree(bt->RChild,nLayer+1);ﻩfor(i=0;i<nLayer;i++)ﻩﻩprintf("");ﻩprintf("%c\n",bt->data); PrintTree(bt->LChild,nLayer+1);}voidLeafTree(BiTreebt)ﻩ//树的叶子结点遍历{ if(bt!=NULL)ﻩ{ if(bt->LChild==NULL&&bt->RChild==NULL) ﻩprintf("%c",bt->data);ﻩ LeafTree(bt->LChild);ﻩ LeafTree(bt->RChild);ﻩ}}voidTravel(BiTreebt)ﻩ ﻩ//树的按层遍历{ BiTreep; LinkQueueQ; InitQueue(&Q); if(bt==NULL) ﻩreturn;ﻩp=bt; EnterQueue(&Q,p); while(Q.front!=Q.rear)ﻩ{ ﻩDeleteQueue(&Q,&p);ﻩﻩprintf("%c",p->data);ﻩ if(p->LChild) ﻩEnterQueue(&Q,p->LChild);ﻩ if(p->RChild)ﻩﻩ EnterQueue(&Q,p->RChild);ﻩ}}2:哈弗曼voidCreat(HuffmanTreeht,intw[],charp[],intn)//构造哈弗曼树。{ﻩints1,s2,i; for(i=1;i<=n;i++)//前n个叶子结点的初始化 {ﻩﻩht[i].weight=w[i]; ﻩht[i].parent=0; ht[i].LChild=0;ﻩ ht[i].RChild=0; }ﻩfor(i=n+1;i<=2*n-1;i++)//权值的初始化。ﻩ{ﻩ select(ht,i-1,&s1,&s2);ﻩﻩht[i].weight=ht[s1].weight+ht[s2].weight;ﻩﻩht[i].parent=0;ﻩﻩ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; ﻩcase't':q[i]=4;break;ﻩﻩcase'a':q[i]=2;break;ﻩﻩcase'e':q[i]=6;break; 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ﻩ ﻩ cd[start]='1'; ﻩc=p; ﻩp=ht[p].parent; } hc[i]=(char*)malloc((m-start)*sizeof(char)); strcpy(hc[i],&cd[start]);ﻩ printf("%s",hc[i]); i++;ﻩ}ﻩﻩfree(cd);}voidprint(HuffmanTreeht,intn){ inti; for(i=1;i<=2*n-1;i++) ﻩprintf("%4d%4d%4d\n",ht[i].weight,ht[i].LChild,ht[i].RChild);}调试情况,设计技巧及体会1.对自己的设计进行评价,指出合理和局限性之处,提出改善方案;打印树状二叉树的模块没有能按照自然数的形式打印,有待改善。2.对设计及调试过程的心得体会。源程序清单(电子版)/*建立一棵用二叉链表方式存储的二叉树,并对其进行遍历(先序、中序和后序),打印输出遍历结果。1:从键盘接受输入先序序列,以二叉链表作为存储结构,建立二叉树(以先序来建立),2:将此二叉树按照“树状形式”打印输出,3:对其进行遍历(先序、中序和后序),4:最后将遍历结果打印输出在遍历算法中5:规定至少有一种遍历采用非递归方法。*/#include<stdio.h>#include<string.h>#include<stdlib.h>#defineFALSE0#defineTRUE1typedefstructNode{ﻩ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; temp->next=top->next;ﻩtop->next=temp;ﻩreturnTRUE;}intPopStack(LinkStacktop,BiTree*x){ LinkStacktemp;ﻩtemp=top->next;ﻩif(temp==NULL)ﻩﻩreturnFALSE; *x=temp->elem;ﻩtop->next=temp->next; free(temp);ﻩﻩreturnTRUE;}intCreatBiTree(BiTree*bt)//树的先序建立{ charch; ch=getchar(); if(ch=='#')ﻩ *bt=NULL; else {ﻩ *bt=(BitNode*)malloc(sizeof(BitNode)); ﻩif(*bt==NULL) ﻩﻩreturn0; ﻩ(*bt)->data=ch; CreatBiTree(&((*bt)->LChild)); ﻩCreatBiTree(&((*bt)->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!=NULL) { ﻩQ->rear=Q->front;ﻩﻩQ->front->next=NULL;ﻩ returnTRUE; }ﻩelseﻩﻩreturnFALSE;}intEnterQueue(LinkQueue*Q,BiTreex){ﻩLinkNode*NewNode;ﻩNewNode=(LinkNode*)malloc(sizeof(LinkQueue)); if(NewNode!=NULL) { ﻩNewNode->w=x; ﻩNewNode->next=NULL;ﻩﻩQ->rear->next=NewNode;ﻩ Q->rear=NewNode; returnTRUE;ﻩ}ﻩelseﻩ returnFALSE;}intDeleteQueue(LinkQueue*Q,BiTree*x){ﻩLinkNode*p; if(Q->front==Q->rear) returnFALSE;ﻩp=Q->front->next; Q->front->next=p->next;ﻩif(Q->rear==p) ﻩQ->rear=Q->front;ﻩ*x=p->w;ﻩfree(p);ﻩreturnTRUE;}voidpreOrder(BiTreebt)ﻩ//先序遍历。{ﻩif(bt!=NULL) { printf("%c",bt->data);ﻩﻩpreOrder(bt->LChild);ﻩ preOrder(bt->RChild); }}voidInOrder(BiTreebt)ﻩ//中序遍历。{ if(bt!=NULL) { ﻩInOrder(bt->LChild); printf("%c",bt->data); InOrder(bt->RChild);ﻩ}}voidPostOrder(BiTreebt)ﻩ//后序遍历。{ﻩif(bt!=NULL) { PostOrder(bt->LChild); PostOrder(bt->RChild);ﻩ printf("%c",bt->data);ﻩ}}voidTraver(BiTreebt){ﻩ}intPostTreeDepth(BiTreebt){ﻩinthl,hr,max;ﻩif(bt!=NULL) { hl=PostTreeDepth(bt->LChild);ﻩﻩhr=PostTreeDepth(bt->RChild);ﻩ 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("%c",p->data);ﻩ ﻩif(p->RChild!=NULL)ﻩ ﻩﻩPushStack(s,p->RChild); if(p->LChild!=NULL)ﻩﻩﻩﻩPushStack(s,p->LChild); ﻩ}}/*voidPreStack(BiTreebt)ﻩ//非递归先序遍历{ﻩBiTreep;ﻩLinkStacks; InitStack(&s);ﻩp=bt;ﻩwhile(p||!Isempty(s))ﻩ{ ﻩif(p) {ﻩ printf("%c",p->data);ﻩ PushStack(s,p);ﻩﻩﻩp=p->LChild; } else ﻩ{ﻩﻩ PopStack(s,&p); ﻩﻩp=p->RChild; } }}*/voidPrintTree(BiTreebt,intnLayer){ﻩinti;ﻩif(bt==NULL) ﻩreturn;ﻩPrintTree(bt->RChild,nLayer+1); for(i=0;i<nLayer;i++)ﻩﻩprintf("");ﻩprintf("%c\n",bt->data); PrintTree(bt->LChild,nLayer+1);}voidLeafTree(BiTreebt) //树的叶子结点遍历{ if(bt!=NULL)ﻩ{ ﻩif(bt->LChild==NULL&&bt->RChild==NULL)ﻩﻩ printf("%c",bt->data); LeafTree(bt->LChild); LeafTree(bt->RChild); }}voidTravel(BiTreebt) ﻩﻩ//树的按层遍历{ BiTreep;ﻩLinkQueueQ;ﻩInitQueue(&Q); if(bt==NULL)ﻩ return;ﻩp=bt; EnterQueue(&Q,p); while(Q.front!=Q.rear) { DeleteQueue(&Q,&p);ﻩﻩprintf("%c",p->data);ﻩ if(p->LChild) ﻩ EnterQueue(&Q,p->LChild);ﻩﻩif(p->RChild) ﻩEnterQueue(&Q,p->RChild); }}voidmain(){ BiTreebt; intnLayer; CreatBiTree(&bt);ﻩnLayer=PostTreeDepth(bt); printf("树的深度:%d\n",nLayer); printf("树的树状打印:\n"); PrintTree(bt,nLayer);ﻩprintf("前序访问:\n");ﻩpreOrder(bt); printf("\n");ﻩprintf("中序访问:\n"); InOrder(bt);ﻩprintf("\n");ﻩprintf("后序访问:\n");ﻩPostOrder(bt); printf("\n"); printf("非递归访问:\n"); PreStack(bt);ﻩprintf("\n"); printf("树的叶子结点有:\n");ﻩLeafTree(bt); printf("\n");ﻩprintf("树的按层遍历:\n");ﻩTravel(bt);ﻩprintf("\n");}2://huffman#include<stdio.h>#include<stdlib.h>#include<string.h>#defineN20#defineM2*N-1typedefchar*Huffmancode[N+1];typedefstruct{ﻩintweight; intparent; intLChild;ﻩintRChild;}HTNode,HuffmanTree[M+1];//建立哈弗曼树的几个函数。voidselect(HuffmanTreeht,intpos,int*s1,int*s2)//寻找最小孩子形成最优二叉树。{ﻩintm1,m2; inti; m1=m2=32767;ﻩfor(i=1;i<=pos;i++)ﻩ{ﻩﻩif(ht[i].parent==0&&ht[i].weight<m1)ﻩ { ﻩ m2=m1; ﻩm1=ht[i].weight; *s2=*s1; ﻩ *s1=i;ﻩﻩ} ﻩelseif(ht[i].parent==0&&ht[i].weight<m2)ﻩ { ﻩ m2=ht[i].weight;ﻩ *s2=i;ﻩ } } if(*s1>*s2)ﻩ{ i=*s1; *s1=*s2; *s2=i;ﻩ}}voidCreat(HuffmanTreeht,intw[],charp[],intn)//构造哈弗曼树。{ﻩints1,s2,i;ﻩfor(i=1;i<=n;i++)//前n个叶子结点的初始化 { ht[i].weight=w[i]; ﻩht[i].parent=0; ﻩht[i].LChild=0; ﻩht[i].RChild=0;ﻩ} for(i=n+1;i<=2*n-1;i++)//权值的初始化。ﻩ{ ﻩselect(ht,i-1,&s1,&s2);ﻩﻩht[i].weight=ht[s1].weight+ht[s2].weight; ht[i].parent=0; ﻩ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])

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论