哈夫曼樹(帶權最優二叉樹)

2021-08-20 06:03:24 字數 2515 閱讀 7666

一、哈夫曼樹

1、哈夫曼樹簡介

哈夫曼樹(huffman)樹又稱最優二叉樹,是指對於一組帶有確定權值的葉子結點所構造的具有帶權路徑長度最短的二叉樹。從樹中乙個結點到另乙個結點之間的分支構成了兩結點之間的路徑,路徑上的分支個數稱為路徑長度。二叉樹的路徑長度是指由根結點到所有葉子結點的路徑長度之和。如果二叉樹中的葉子結點都有一定的權值,則可將這一概念拓展:設二叉樹具有n個帶權值的葉子結點,則從根結點到每乙個葉子結點的路徑長度與該葉子結點權值的乘積之和稱為二叉樹路徑長度,記做:

wpl = w1l1 + w2l2 +

......

+ wnln;

其中:n為二叉樹中葉子結點的個數;wk為第k個葉子的權值;lk為第k個葉子結點的路徑長度。

2、哈夫曼樹的構造過程

1. 對資料中出現過的元素各產生乙個樹葉節點,並賦予其出現的頻率。

2. 令n為t1和t2的父節點,其中t1和t2是出現頻率最低的兩個節點,令n的頻率為t1和t2的頻率之和。

3. 消去兩個節點,插入n節點,重複前面的步驟。

3、構造哈夫曼樹的demo:

#include 

#include

#include

#include

#include

using

namespace

std;

typedef

struct huffumantree

*htree;

tupleint> creat_tree(vector

&vec)

for (int i = 0; i < sz - 1; ++i)

);//選取權值最小的兩棵樹,並刪除

auto a = forest.front();

forest.pop_front();

auto b = forest.front();

forest.pop_front();

//構建新的樹,加入到佇列

htree ptr2 = new huffumantree;

ptr2->weight = a->weight + b->weight;

ptr2->left = a;

ptr2->right = b;

forest.push_back(ptr2);

//累加權值

ans += ptr2->weight;

}auto root = forest.front();

deque

().swap(forest);

return make_tuple(root, ans);

}void print_tree(htree root)

}int main(int argc, char

const *argv)

; htree root;

int sum;

tie(root, sum) = creat_tree(a);

cout

<< sum << endl;

print_tree(root);

return

0;}

二、哈夫曼編碼哈夫曼編碼(huffman coding)是一種編碼方法,哈夫曼編碼是可變字長編碼(vlc)的一種。

哈夫曼編碼使用變長編碼表對源符號(如檔案中的乙個字母)進行編碼,其中變長編碼表是通過一種評估**符號出現機率的方法得到的,出現機率高的字母使用較短的編碼,反之出現機率低的則使用較長的編碼,這便使編碼之後的字串的平均長度、期望值降低,從而達到無失真壓縮資料的目的。

1、構建哈夫曼編碼

首先根據資料出現的頻率建立一棵哈夫曼樹,假如我有a,b,c,d,e五個字元,出現的頻率(即權值)分別為5,4,3,2,1,那麼構建的哈夫曼樹如下所示:

如果節點在父結點左側,則編碼為 0,若在右側,則編碼為 1。

所以各字元對應的編碼為:a->11,b->10,c->00,d->011,e->010

哈夫曼樹(最優二叉樹)

給定n個權值作為n的 葉子結點,構造一棵二叉樹,若帶權路徑長度達到最小 所謂樹的帶權路徑長度,就是樹中所有的葉結點 的權值乘上其到根結點的路徑長度 稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹 huffman tree 哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。假設有n個權值,則構造出的...

哈夫曼樹(最優二叉樹)

最優二叉樹 哈夫曼樹 給定n個權值,試構造一棵有n個葉子結點的二叉樹,每個葉子結點帶權為wi。構造出來的二叉樹的形態可以有多個,我們把其中帶權路徑長度wpl最小的二叉樹稱作最優二叉樹或者哈夫曼樹。語言描述 根據給定的n個權值構成n棵二叉樹的集合f 其中每棵二叉樹ti中只有乙個帶權為wi的根結點,其左...

哈夫曼樹 最優二叉樹

差點忘記寫部落格了.哈夫曼樹 其實就是只利用葉子結點來儲存要用資訊的樹,只不過它在構造的時候就擁有了乙個迷人的特性.就是wpl 帶權路徑長度 是最小的.而且還能用這個樹的來為葉子結點中的資訊進行編碼,得出來的各個編碼一定不會相同,並且不會產生混淆的情況.通過哈夫曼樹的特點.實現了根據乙個佇列來建立一...