赫夫曼樹,即最優二叉樹。
給定n個權值作為n個葉子結點,構造一棵二叉樹,若該樹的帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹(huffman tree)。哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。構造赫夫曼樹:
把節點的權值按從小到大的順序排列。
從序列中取出前兩個(最小),作為孩子節點,求出其父節點的權重並加入到序列。
重複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)
//按照權重,插入鍊錶佇列
void insert_into_linklist ( plnode &head, plnode val )
//否則,根據權重比較,p最終指向
else
//cout << "insert one.\n";
}//從佇列中取出節點
phfmtree remove_from_list( plnode &head )
//生成赫夫曼樹
phfmtree createhfmtree( char *inputstring, int *weight_res, plnode &head )
}//cout << "insert success...."next )
//最後,佇列中只剩頭結點和赫夫曼樹的根節點,將其釋放,這個佇列也就清理了。
delete head->next;
delete head;
return head->next->ptree;//返回赫夫曼樹的根
}//清理赫夫曼樹
void cleartree ( phfmtree head )
//編碼
void encode( phfmtree node , char *res, int index )
phfmtree right = node->rchild;
if( null!=right )
}//解碼
void decode( char *code, phfmtree root )
cout << endl;
return;
}//有多個節點
phfmtree p = root;
for( int i=0; ilchild;
if( null==p->lchild&&null==p->rchild )
if( code[i]=='1' )
p = p->rchild;
if( null==p->lchild&&null==p->rchild )
}cout << endl;
}
執行結果:
哈夫曼樹,赫夫曼樹
參考 赫夫曼樹,別名 哈夫曼樹 最優樹 以及 最優二叉樹 當用 n 個結點 這些結點都作為葉子結點且都有各自的權值 試圖構建一棵樹時,如果構建的這棵樹的帶權路徑長度最小,稱這棵樹為 最優二叉樹 有時也叫 赫夫曼樹 或者 哈夫曼樹 構建哈夫曼樹 在 n 個權值中選出兩個最小的權值,對應的兩個結點組成乙...
赫夫曼樹 樹
在資料膨脹,資訊 的今天,資料壓縮的意義不言而喻。談到資料壓縮,就不能 不提赫夫曼編碼,赫夫曼編碼是首個使用的壓縮編碼方案,即使在今天的知名壓縮演算法裡,依然可以見到赫夫曼編碼的影子。另外,在資料通訊中,用二進位製給每個字元進行編碼時不得不面對乙個問題是如何使電文總長最短且不產生二義性。根據字元出現...
樹 赫夫曼樹
幾個概念 wpl最小的就是赫夫曼樹 赫夫曼樹的建立 將數列 轉成一顆赫夫曼樹的過程 將數列元素從小到大排序 取出最小的兩個元素,生成一棵新的二叉樹,取出的兩個元素作為新二叉樹的子節點 一般權重小的作為子節點 根節點的權重為子節點權重之和 將處理過的兩個元素從列表中刪除,將新的根節點加入列表 重複1 ...