前面一節我們知道了,怎樣去建立乙個哈夫曼樹,這一節我們來看看哈夫曼編碼。
思想:得到哈夫曼樹後,自頂向下按路徑編號,指向左節點的邊編號0,指向右節點的邊編號1,從根到葉節點的所有邊上的0和1連線起來,就是葉子節點中字元的哈夫曼編碼。
下圖體現了哈夫曼編碼的過程:
//哈夫曼樹結點
typedef struct huffnode
huffman;
//佇列設計
typedef struct _node_
listnode;
typedef struct
queue;
//create empty queue
queue *create_empty_queue()/
/入隊int enterqueue(queue *head,huffman *data)
//有序插入結點
int orderenterqueue(queue *head,huffman *p)
else}/
/插到最後乙個結點
if(m =
=null)/
/插入中間結點
temp =
(listnode *
)malloc(sizeof(listnode));
temp-
>data = p;
n->
next
= temp;
temp-
>
next
= m;
return 0;}/
/判斷佇列是否為空(注意,我們認為佇列含有乙個結點為空,想想為什麼
//這樣做?
int _is_empty_queue(queue *head)
return 0;}/
/判斷佇列是否為空
int is_empty_queue(queue *head)
//出隊
huffman *deletequeue(queue * head)
//建立哈夫曼樹
huffman *create_huffman_tree(queue *head)
return head-
>front-
>
next
->data;}/
/哈夫曼編碼
int huffmancode(huffman *root)
if(current-
>lchild)
if(current-
>rchild)
}return 0;
}執行結果:
c語言實現霍夫曼樹
include include include typedef struct htnode htnode sss 26 int sum 0 void htcd char str if flag 0 for i 0 i m 2 sum 1 for i 0 i for i m i for i 0 i c...
霍夫曼樹 編碼
用陣列儲存二叉樹,fun encrypt leaf 由葉子開始至根部編碼,這個儲存編碼串時從尾部開始儲存,對編碼好的字串進行拷貝時正好倒置 過來 fun encrypt recursion 從根部開始遞迴到葉子進行編碼 fun encrypt onrecurent 非遞迴無棧從根部到葉子進行編碼。思...
資料結構 霍夫曼樹
帶權路徑長度最小的樹,常用於資料通訊中。構造霍夫曼樹演算法 設給定的一組權值為,據此生成森林f f 中的沒棵二叉樹只有乙個帶權為w1的根節點 i 1,2,n 在f中選取兩棵根節點的權值最小和次小的二叉樹作為左右構造一棵新的二叉樹,新二叉樹根節點的權值為其左 右子樹根節點的權值之和。在f中刪除這兩棵最...