赫夫曼樹,即最優二叉樹。
給定n個權值作為n個葉子結點,構造一棵二叉樹,若該樹的帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹(huffman tree)。哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。構造赫夫曼樹:
1. 把節點的權值按從小到大的順序排列。
2. 從序列中取出前兩個(最小),作為孩子節點,求出其父節點的權重並加入到序列。
3. 重複1,2,直到序列中只剩乙個節點。這個節點就是赫夫曼樹的根節點。
#include
#include
using
namespace
std;
//赫夫曼樹
typedef
struct hfmtree *phfmtree;
//佇列節點(鍊錶實現)
typedef
struct link_node lnode,*plnode;
//得到權重
int* get_weight( char *inputstring );
//初始化鍊錶
void init_link( plnode &p );
//按照權重,插入鍊錶
void insert_into_linklist ( plnode &head, plnode val );
//從鍊錶中取出節點
phfmtree remove_from_list( plnode &head );
//生成赫夫曼樹
phfmtree createhfmtree( char *inputstring, int *weight, plnode &head );
//釋放記憶體
void cleartree ( phfmtree head );
//編碼
void encode( phfmtree root , char *res ,int index );
//解碼
void decode( char *code, phfmtree root );
int main(int argc, char
const *argv)
else
delete weight_res;
//cout << "finally.\n";
return0;}
//得到權重
int* get_weight( char *inputstring )
int* weight_result = new
int[256];
//初始化權重表
for( int i=0; i<256; ++i )
weight_result[i] = 0;
for( int i=0; inputstring[i]!='\0'; ++i )
return weight_result;
}//初始化鍊錶
void init_link( plnode &p )
//按照權重,插入鍊錶佇列
void insert_into_linklist ( plnode &head, plnode val )
//否則,根據權重比較,p最終指向
else
//cout << "insert one.\n";
}//從佇列中取出節點
phfmtree remove_from_list( plnode &head )
phfmtree first = head->next->ptree;
plnode todel = head->next;
head->next = todel->next;
delete todel;
//cout << "remove ing\n";
return first;
}//生成赫夫曼樹
phfmtree createhfmtree( char *inputstring, int *weight_res, plnode &head )
}//cout << "insert success...."
//當佇列中還有至少2個節點時,繼續取出,直到只剩乙個節點
while( null!=head->next->next )
//最後,佇列中只剩頭結點和赫夫曼樹的根節點,將其釋放,這個佇列也就清理了。
delete head->next;
delete head;
return head->next->ptree;//返回赫夫曼樹的根
}//清理赫夫曼樹
void cleartree ( phfmtree head )
//編碼
void encode( phfmtree node , char *res, int index )
phfmtree left = node->lchild;
if( null!=left )
phfmtree right = node->rchild;
if( null!=right )
}//解碼
void decode( char *code, phfmtree root )
cout
<< endl;
return;
}//有多個節點
phfmtree p = root;
for( int i=0; i
if( code[i]=='1' )
p = p->rchild;
if( null==p->lchild&&null==p->rchild )
}cout
<< endl;
}
執行結果:
赫夫曼樹簡單實現
給定n個權值作為n個葉子結點,構造一棵二叉樹,若該樹的帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹 huffman tree 哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。權值可以看作節點中存放的值,路徑長度即為該葉子節點所處的層數減去1。其中 路徑長度 節點權值 相加...
哈夫曼樹,赫夫曼樹
參考 赫夫曼樹,別名 哈夫曼樹 最優樹 以及 最優二叉樹 當用 n 個結點 這些結點都作為葉子結點且都有各自的權值 試圖構建一棵樹時,如果構建的這棵樹的帶權路徑長度最小,稱這棵樹為 最優二叉樹 有時也叫 赫夫曼樹 或者 哈夫曼樹 構建哈夫曼樹 在 n 個權值中選出兩個最小的權值,對應的兩個結點組成乙...
赫夫曼樹 樹
在資料膨脹,資訊 的今天,資料壓縮的意義不言而喻。談到資料壓縮,就不能 不提赫夫曼編碼,赫夫曼編碼是首個使用的壓縮編碼方案,即使在今天的知名壓縮演算法裡,依然可以見到赫夫曼編碼的影子。另外,在資料通訊中,用二進位製給每個字元進行編碼時不得不面對乙個問題是如何使電文總長最短且不產生二義性。根據字元出現...