哈夫曼樹 C怪談

2021-08-09 06:59:35 字數 3037 閱讀 7317

之所以想談談哈夫曼樹,覺得這玩意還是挺好玩的。它在某些應用中能達到最優處理,這一點就能夠吹牛b一大會了。

首先呢,什麼是哈夫曼樹,講道理,它就是一顆二叉樹,平凡的二叉樹怎麼無故帶個名字呢,可見它並不平凡,它是一種帶權路徑長度最短的二叉樹,也叫做最優二叉樹。

從樹中乙個結點到另乙個結點之間的分支構成兩個結點之間的路徑,路徑的分支數叫做路徑的長度。

樹的路徑長度就是從樹根到每一結點的路徑長度之和。

樹的帶權路徑長度記為wpl= (w1*l1+w2*l2+w3*l3+…+wn*ln),

n個權值wi(i=1,2,…n)構成一棵有n個葉結點的二叉樹,相應的葉結點的路徑

長度為li(i=1,2,…n)。可以證明哈夫曼樹的wpl是最小的。

赫赫,這個是必須要說的,但是很簡單,哈夫曼大叔是這樣規定的:

左分支代表0;

右分支代表1;

然後對要表示的資料進行01二進位制編碼。用01串來對其進行編碼,壓縮程度是相當可觀的。與此同時,又是如此的簡單。

不能免俗,**還是要有的。不然直到原理,沒辦法和實際進行結合也是不行的。

#ifndef hft_h

#define hft_h

#define maxbit 100

#define maxvalue 10000

#define maxleaf 30

#define maxnode maxleaf*2 -1

typedef

struct

hcodetype; /* 編碼結構體 */

typedef

struct

hnodetype; /* 結點結構體 */

void huffmantree (hnodetype huffnode[maxnode], int n);

void decodeing(char

string,hnodetype buf,int num);

#endif // !hft_h

#include 

#include

#include

#include "hft.h"

/*-------------------

*--------------------*/

/* 構造一顆哈夫曼樹 */

void huffmantree (hnodetype huffnode[maxnode], int n)

/* end for */

/* 輸入 n 個葉子結點的權值 */

for (i=0; iprintf ("please input weight of leaf node %d: \n", i);

scanf ("%d", &huffnode[i].weight);

} /* end for */

/* 迴圈構造 huffman 樹 */

for (i=0; i1; i++)

else

if (huffnode[j].weight < m2 && huffnode[j].parent==-1)

} /* end for */

/* 設定找到的兩個子結點 x1、x2 的父結點資訊 */

huffnode[x1].parent = n+i;

huffnode[x2].parent = n+i;

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

huffnode[n+i].lchild = x1;

huffnode[n+i].rchild = x2;

printf ("x1.weight and x2.weight in round %d: %d, %d\n", i+1, huffnode[x1].weight, huffnode[x2].weight); /* 用於測試 */

printf ("\n");

} } /* end huffmantree */

//解碼

void decodeing(char

string,hnodetype buf,int num)

i=0;

nump=&num[0];

while(nump<(&num[strlen(string)]))

else tmp=buf[tmp].rchild;

nump++;

} printf("%d",buf[tmp].value);

}}

int main(void)

/* end while */

/* 儲存求出的每個葉結點的哈夫曼編碼和編碼的起始位 */

for (j=cd.start+1; j/* end for */

/* 輸出已儲存好的所有存在編碼的哈夫曼編碼 */

for (i=0; iprintf ("%d 's huffman code is: ", i);

for (j=huffcode[i].start+1; j < n; j++)

printf(" start:%d",huffcode[i].start);

printf ("\n");

}printf("decoding?please enter code:\n");

scanf("%s",&pp);

decodeing(pp,huffnode,n);

getchar();

getchar();

return

0;}

好了,對於哈夫曼叔叔的這個套路就先聊到這裡啦。下期再見~

哈夫曼樹及哈夫曼編碼 C

說明 1.讀取檔案中需進行哈夫曼編碼的資料資訊 2.構造生成單節點二叉樹組 森林 3.構造哈夫曼樹 4.進行哈夫曼編碼 5.輸出對應資料及其編碼 include include includeusing namespace std const int max n 100 最大容量 const int...

哈夫曼編碼 哈夫曼樹

1.定義 哈夫曼編碼主要用於資料壓縮。哈夫曼編碼是一種可變長編碼。該編碼將出現頻率高的字元,使用短編碼 將出現頻率低的字元,使用長編碼。變長編碼的主要問題是,必須實現非字首編碼,即在乙個字符集中,任何乙個字元的編碼都不是另乙個字元編碼的字首。如 0 10就是非字首編碼,而0 01不是非字首編碼。2....

哈夫曼樹 哈夫曼編碼

定義從a結點到b結點所經過的分支序列為從a結點到b結點的路徑 定義從a結點到b結點所進過的分支個數為從a結點到b結點的路徑長度 從二叉樹的根結點到二叉樹中所有結點的路徑長度紙盒為該二叉樹的路徑長度 huffman樹 帶權值路徑長度最小的擴充二叉樹應是權值大的外界點舉例根結點最近的擴充二叉樹,該樹即為...