Huffman樹和其編碼

2022-04-08 04:57:49 字數 2030 閱讀 9927

小編最近學習了huffman樹,特此記錄一下。

線索樹 n個節點的二叉樹 n-1條指針線,n個節點右2n個指標域,右n+1個空閒指標,利用這些空閒指標來存放直接前驅和直接後繼資訊。

若節點右左孩子:則lchild指向左孩子,否則指向直接前驅。

若節點由右孩子:則lchild指向右孩子,否則指向直接後繼。

我們增加兩個標緻域 ltag:0 指向左孩子 1 指向前驅 rtag:0指向右孩子 1 指向直接後繼

線索鍊錶  按照某種次序遍歷,加上線索的二叉樹叫線索二叉樹。

typedef struct

bithrnode

bithrnode;

typedef

struct

listnode

ctnode;

typedef

struct

hnode;

typedef

struct

clinklist;

//孩子兄弟表示法(二叉樹表示法) 兩個指標域,分別指向節點的第乙個子節點和下乙個兄弟節點

//和二叉樹的 左右節點類似

typedef struct

csnode

csnode;

//樹轉換成二叉樹

//1 加虛線 在樹的每層按從左至右的數需在兄弟節點之間加上虛線

//2 去連線 除最左邊的第乙個子節點之外,父節點與其所有其他子節點的連線都去掉

//3 旋轉 將樹順時針旋轉45 原有實線傾斜

//4 整型 旋轉後的所有虛線改為實線 並向右傾斜

//樹和森林沒有 中序遍歷

//赫夫曼樹 最優樹 帶權路徑最短的樹

//樹的路徑長度 樹根到每個節點的路徑長度之和

//帶權的路徑長度 從該節點到樹的根節點之間的路徑長度與節點的權的乘積

//建立一顆葉子節點數為n的huffman數

//生成huffman數後 樹的根節點的下標是2n-1 即m-1

void

create_huffman(unsigned n, htnode ht, unsigned m)

else ht[k].weight = 0

; ht[k].parent = ht[k].lchild = ht[k].rchild = 0

; }

for (k = n + 1; k < m; k++)

else

if(ht[k].weight}}

ht[k].lchild = p1; ht[k].rchild =p2;

ht[k].weight = w1 +w2;

ht[p1].parent = k; ht[p2].parent =k;}}

huffman可以用來構造編碼長度不等且解碼不產生二義性的編碼。

我們對生成的huffman樹,進行編碼。

產生的編碼如下:

huffman編碼演算法,又來那種處理的方式:

1 從葉子節點到根節點逆向處理,求得每個葉子節點的對應字元的huffman編碼。

2 從根節點開始遍歷整個二叉樹,求得每個葉子節點得對應字元得huffman編碼。

//

huffman編碼演算法

//根據出現頻度(權值)weight,對葉子節點的huffman編碼。

void

huff_coding(unsigned n, hnode ht, unsigned m)

free(cd);

}

上述**為第一種。產生得編碼在hc多維陣列儲存。

huffman樹和huffman編碼

huffman樹和huffman編碼 include include include include define overflow 1 typedef struct htnode,huffmantree typedef char huffmancode void select huffmantre...

Huffman樹和編碼

include include include define maxbit 100 define maxvalue 10000 define maxleaf 30 define maxnode maxleaf 2 1 typedef struct hcodetype 編碼結構體 typedef st...

Huffman樹與Huffman編碼

一.哈夫曼樹概念 路徑 祖先到節點之間的分支構成一條通往節點的路徑 路徑長度 路徑上分支的數目稱為路徑長度 節點的權 給樹中節點所設的物理意義的值 節點帶權路徑長度 從根到該點路徑長度與該點權值的乘機 huffman樹就是所有樹中每點帶權路徑加和最短的樹。二.huffman樹構造步驟 1.根據每個點...