赫夫曼樹(huffman tree)又稱為最優樹,是一類帶權路徑長度最短的樹。本文僅討論最優二叉樹。
樹的路徑長度是指從樹根到樹中其餘各個結點的路徑長度之和。對具有n個結點的二叉樹而言,完全二叉樹具有最短的樹的路徑長度。
若在二叉樹中,樹葉結點帶有權值,則有:結點的帶權路徑長度定義為從樹根到該結點之間的路徑長度與該結點上所帶權值之積。
若樹中有n個樹葉結點,且每個樹葉結點均帶有權值,則有:樹的帶權路徑長度定義為樹中所有樹葉結點的帶權路徑長度之和,可記為:
有時,也將樹的路徑長度稱為內路徑長度,而將樹的帶權路徑長度稱為樹的外路徑長度。
構造最優樹的赫夫曼演算法:
①根據給定的n個權值,構成n棵二叉樹的集合f,其中每棵樹中只有乙個帶有權值的根結點,其左右子樹均為空樹。
②在f中選取兩棵根結點的權值最小的樹,並以它們作為左右子樹構造一棵新的二叉樹,且置新的二叉樹根結點的權值為其左、右子樹上根結點的權值之和。
③在f中刪除這兩棵樹,同時將新得到的二叉樹加入f中。
重複②③步驟,知道f只含一棵樹而知。這棵樹便是所求的的赫夫曼樹。
具有n個樹葉結點的赫夫曼(二叉)樹總的結點個數為2n-1。由於樹中的結點個數是確定的,因此,選擇靜態樹表作為儲存結構,結合即將討論的赫夫曼編碼,最終選擇靜態三叉樹表作為建立赫夫曼樹的儲存結構。靜態三叉樹表結點結構如下:
struct htnode
;
huffmantree類宣告如下:#pragma once
#define maxsize 1000
#include "htnode.h"
#include class huffmantree
~huffmantree()
void display();
private:
int m_htsize; //樹葉結點個數
htnode* m_ht;
void _create(int,char cha,int weighta);
int _minval(const int&);
void _select(const int,int&,int&);
};
huffmantree類實現如下:#include "huffmantree.h"
#include using namespace std;
void huffmantree::_create(int n,char cha,int weighta)
for (i = 0; i < n; i++)
while(i < m_htsize) }
void huffmantree::display()
}
赫夫曼樹的乙個重要應用是在通訊中構造最優的字首編碼,從而使得電文長度達到最短。
通常有兩類二進位制編碼:
①等長編碼:編碼的二進位制長度取決於電文**現的字元個數。
②不等長編碼:各字元的二進位制編碼長度不等。它的好處是可以使傳送電文的字串總長度盡可能的短。
通常各個字元在電文**現的次數是不相同的,若對出現次數較多的字元採用盡可能短的編碼,則傳送電文的總長便可減少。
在實用的不等長編碼中,任一乙個字元的編碼都不能是另乙個字元編碼的字首,這種編碼成為字首編碼。
赫夫曼編碼表的結點結構定義如下:
//赫夫曼編碼表結點結構
struct hcnode
;
赫夫曼編碼類實現如下:#pragma once
#include "hcnode.h"
#include "huffmantree.h"
class huffmancoder
~huffmancoder()
delete m_hc;
} void createbook(huffmantree&);
void coder(char ch);
void decoder(huffmantree&);
private:
hcnode* m_hc; //赫夫曼編碼表基位址指標
int m_hcsize; //外結點個數
程式輸出:
資料結構 赫夫曼樹
赫夫曼編碼是首個試用的編碼方案。屬於無失真壓縮的編碼方案。在資料通訊中,赫夫曼編碼可以根據字元出現頻率,構造出一種不等長的二進位制,使編碼後的電文長度最短,且不產生二義性。weighteed path length是樹中所有節點的帶權路徑長度之和。wpl 值越小,說明構造出來的二叉樹效能越優。赫夫曼...
資料結構(八) 赫夫曼樹
一 基本介紹 1 給定n個權值作為n個葉子節點,構造一顆二叉樹,如果這個樹的帶權路徑長度達到最小,就叫做 最優二叉樹 也叫 赫夫曼樹 帶權路徑最短 最優二叉樹 赫夫曼樹 2 赫夫曼樹是帶權路徑長度最短的樹,權值較大的節點離根很近 二 重要概念 三 赫夫曼樹建立思路 乙個數列,要求轉成一顆赫夫曼樹 1...
資料結構之赫夫曼樹
每個結點應該包含的資訊有 字元內容 父結點和左右孩子結點的下標 權重以及該字元的編碼。struct hfnode class huffmantree void selectmin int len,int s1,int s2 else if ht i weight min2 void createhf...