小編最近學習了huffman樹,特此記錄一下。
線索樹 n個節點的二叉樹 n-1條指針線,n個節點右2n個指標域,右n+1個空閒指標,利用這些空閒指標來存放直接前驅和直接後繼資訊。
若節點右左孩子:則lchild指向左孩子,否則指向直接前驅。
若節點由右孩子:則lchild指向右孩子,否則指向直接後繼。
我們增加兩個標緻域 ltag:0 指向左孩子 1 指向前驅 rtag:0指向右孩子 1 指向直接後繼
線索鍊錶 按照某種次序遍歷,加上線索的二叉樹叫線索二叉樹。
typedef structhuffman可以用來構造編碼長度不等且解碼不產生二義性的編碼。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編碼演算法,又來那種處理的方式:
1 從葉子節點到根節點逆向處理,求得每個葉子節點的對應字元的huffman編碼。
2 從根節點開始遍歷整個二叉樹,求得每個葉子節點得對應字元得huffman編碼。
//上述**為第一種。產生得編碼在hc多維陣列儲存。huffman編碼演算法
//根據出現頻度(權值)weight,對葉子節點的huffman編碼。
void
huff_coding(unsigned n, hnode ht, unsigned m)
free(cd);
}
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.根據每個點...