2023年樹的實驗報告_第1頁
2023年樹的實驗報告_第2頁
2023年樹的實驗報告_第3頁
2023年樹的實驗報告_第4頁
2023年樹的實驗報告_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

2023-2023學年第一學期數(shù)據(jù)結構課內(nèi)實驗報告學院:計算機學院專業(yè):計算機科學與技術姓名:學號:指導老師:實驗題目實驗目的1.掌握二叉樹的建立,遞歸遍歷(先序,中序,后序),打印樹狀二叉樹,計算葉子節(jié)點的個數(shù)。2.二叉樹的非遞歸遍歷3.掌握哈夫曼樹的基本算法。實驗內(nèi)容1.樹的遞歸與非遞歸遍歷(1)從鍵盤接受輸入先序序列,以二叉鏈表作為存儲結構,建立二叉樹(以先序來建立),(2)將此二叉樹按照“樹狀形式”打印輸出,(3)對其進行遍歷(先序、中序和后序),(4)最后將遍歷結果打印輸出在遍歷算法中(5)規(guī)定至少有一種遍歷采用非遞歸方法2.哈夫曼基本規(guī)定:(1)從終端讀入字符集大小n,以及n個字符和n個權值,建立哈夫曼樹;(2)打印每一個字符相應的哈夫曼編碼。(3)對從終端讀入的字符串進行編碼,并顯示編碼結果。四:模塊化分各個模塊具體的功能描述。voidPreOrder(BTreeroot);先序遍歷voidInOrder(BTreeroot);中序遍歷voidPostOrder(BTreeroot);后序遍歷voidPreleaf(BTreeroot);先序求葉子節(jié)點個數(shù)voidPrintfTree(BTreeroot,inth);打印二叉樹intPostHeight(BTreeroot));后序求樹的深度voidInitTree(BiTree*bt);初始化樹intInitStack(Stack*top);初始化棧BiTnode*Creat(yī)e();//擴展結點創(chuàng)建二叉樹intPush(Stack*top,BiTreep);入棧intPop(Stack*top,BiTree*p);出棧intGetTop(Stacktop,BiTreep);取棧頂元素voidPreStack(BTreeroot);//非遞歸先序遍歷voidSelect(HTreeht,intpos/*尋找的范圍*/,int*s1,int*s2)//查找最小的兩個節(jié)點的下標voidCreatHuffmanTree(HTreeht,intw[],intn)//創(chuàng)建哈夫曼樹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->dat(yī)a); PrintTree(bt->LChild,nLayer+1);}voidLeafTree(BiTreebt)?//樹的葉子結點遍歷{ if(bt!=NULL)?{ if(bt->LChild==NULL&&bt->RChild==NULL) ?printf("%c",bt->dat(yī)a);? 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->dat(yī)a);? 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;?}}//生成哈弗曼樹的函數(shù)編碼。voidOrderHuffman(HuffmanTreeht,Huffmancodehc,charstr[],intm)//根據(jù)哈弗曼樹構成哈弗曼編碼表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);}調(diào)試情況,設計技巧及體會1.對自己的設計進行評價,指出合理和局限性之處,提出改善方案;打印樹狀二叉樹的模塊沒有能按照自然數(shù)的形式打印,有待改善。2.對設計及調(diào)試過程的心得體會。源程序清單(電子版)/*建立一棵用二叉鏈表方式存儲的二叉樹,并對其進行遍歷(先序、中序和后序),打印輸出遍歷結果。1:從鍵盤接受輸入先序序列,以二叉鏈表作為存儲結構,建立二叉樹(以先序來建立),2:將此二叉樹按照“樹狀形式”打印輸出,3:對其進行遍歷(先序、中序和后序),4:最后將遍歷結果打印輸出在遍歷算法中5:規(guī)定至少有一種遍歷采用非遞歸方法。*/#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)); ?Creat(yī)BiTree(&((*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->dat(yī)a);? ?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->dat(yī)a); 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("樹的樹狀打?。海躰"); 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];//建立哈弗曼樹的幾個函數(shù)。voidselect(HuffmanTreeht,intpos,int*s1,int*s2)//尋找最小孩子形成最優(yōu)二叉樹。{?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;?}}//生成哈弗曼樹的函數(shù)編碼。voidOrderHuffman(HuffmanTreeht,Huffmancodehc,charstr[],intm)//根據(jù)哈弗曼樹構成哈弗曼編碼表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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論