日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

赫夫曼二叉树

發布時間:2024/1/1 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 赫夫曼二叉树 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

代碼區

#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct HuffNode{//赫夫曼結點 int weight,parent,lchild,rchild;//權值,雙親,左/右孩子 }HuffNode; typedef struct HuffTree{//動態分配數組存儲赫夫曼樹 int n;//赫夫曼樹葉子結點個數 HuffNode *hf;//結點向下遞推 }HuffTree; typedef char ** HuffCode;//動char ** 二級指針 動態分配數組存儲赫夫曼編碼表 //顯示赫夫曼表 void DisplayHuffTree(HuffTree HT){int i,m = 2*HT.n-1;printf("序號\t權值\t雙親\t左孩子\t右孩子\n");for(i=1;i<=m;i++)printf("%2d\t%2d\t%2d\t%2d\t%2d\n",i,HT.hf[i].weight,HT.hf[i].parent,HT.hf[i].lchild,HT.hf[i].rchild); }//找出最小的兩個結點s1,s2//雙親必須 == 0 //1-n存放初始的葉子結點,i = n+1;i---2n-1存放合并后的雙親結點 void Select(HuffTree HT,int i,int &s1,int &s2){//HT數組//i為將要成為的雙親//si,s2為兩個較小的結點,即將成為左/右孩子 int j;int min = INT_MAX;//min初始為整數最大值 for(j=1;j<=i;j++){//找出權值最小的那個結點,把下標j賦給s1 if(HT.hf[j].parent==0&&HT.hf[j].weight<=min)//找出雙親等于0&&比較后權值較小的結點//雙親 == 0是沒有變成葉子的結點 {s1 = j;//j下標給s1 min = HT.hf[j].weight;//把較小的結點權值賦給min//最后那個就是最先的權值 結點 }}//再篩選一次,找出另一個最小的結點 min = INT_MAX;for(j=1;j<=i;j++){if(HT.hf[j].parent==0&&j!=s1&&HT.hf[j].weight<=min){s2 = j;min = HT.hf[j].weight;}} }//1-n存放初始的葉子結點,i = n+1;i---2n-1存放合并后的雙親結點 void CreateHuffTree(HuffTree &HT,int n1){int m = 2*n1-1;//m == 2n-1為總結點數 HT.hf = (HuffNode *)malloc((m+1)*sizeof(HuffNode));//0號單元沒用 HT.n = n1;int i;for(i=1;i<=m;i++){//初始全部賦值為0 HT.hf[i].parent = 0;HT.hf[i].lchild = 0;HT.hf[i].rchild = 0;HT.hf[i].weight = 0;}printf("輸入結點的權值\n"); for(i=1;i<=HT.n;i++){//輸入前n個結點的權值 scanf("%d",&HT.hf[i].weight); }printf("顯示空/初始化赫夫曼表\n");DisplayHuffTree(HT);//顯示赫夫曼表 int s1,s2;for(i=HT.n+1;i<=m;i++){Select(HT,i-1,s1,s2);//找出最小的兩個結點s1,s2 HT.hf[s1].parent = i;//i是s1的雙親 HT.hf[s2].parent = i;//i是s2的雙親 HT.hf[i].weight = HT.hf[s1].weight+HT.hf[s2].weight;//下標為i的權值是下標為s1和s2的權值之和 printf("s1=%d s2=%d s1的權值%d s2的權值%d i的權值%d\n",s1,s2,HT.hf[s1].weight,HT.hf[s2].weight,HT.hf[i].weight);HT.hf[i].lchild = s1;//i下標結點的左孩子是s1的下標 HT.hf[i].rchild = s2;//i下標結點的右孩子是s2的下標 }printf("顯示構造完成的赫夫曼表\n"); DisplayHuffTree(HT); }void CreateHuffCode(HuffTree HT,HuffCode &HC){HC = (HuffCode/*(char ** )*/)malloc((HT.n+1)*sizeof(char *));char *cd;//臨時空間 cd = (char*)malloc(HT.n*sizeof(char));int start = HT.n-1;cd[start] = '\0';//最后存儲結束標志 int c,f,i;//孩子c//雙親f for(i=1;i<=HT.n;i++){start = HT.n-1;//start為夫曼表的最后一個結點 c = i;//c是赫夫曼表的第一個結點 f = HT.hf[c].parent;//f是夫曼表的第一個結點的雙親 while(f){start --;//從后向前 if(HT.hf[f].lchild==c)//第i個結點的雙親的孩子 == c cd[start] = '0';//cd【start】位置存放0//左子樹0,右子樹1 elsecd[start] = '1';//cd【start】位置存放1//左子樹0,右子樹1 c = f;f = HT.hf[c].parent;}HC[i] = (char*)malloc((HT.n-start)*sizeof(char));strcpy(HC[i],&cd[start]);}free(cd); } //輸出赫夫曼編碼表 void DisplayHuffCode(HuffTree HT,HuffCode HC){int i,m = 2*HT.n-1;printf("序號\t權值\t雙親\t赫夫曼編碼\n");for(i=1;i<=m;i++)printf("%2d\t%2d\t%2d\t%s\n",i,HT.hf[i].weight,HT.hf[i].parent,HC[i]); }int main(){HuffTree HT;HuffCode HC;//動態分配數組存儲赫夫曼編碼表 CreateHuffTree(HT,8);//構造赫夫曼表 CreateHuffCode(HT,HC);//構造赫夫曼編碼表 int i;printf("赫夫曼編碼表\n"); DisplayHuffCode(HT,HC);for(i=1;i<=HT.n;i++){printf("%s\n",HC[i]);}return 0; }

測試區

總結

以上是生活随笔為你收集整理的赫夫曼二叉树的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。