哈夫曼樹詳解

2021-06-11 06:48:19 字數 1864 閱讀 9717

一:什麼是哈夫曼樹呢?

自己的描述:在樹的路徑長度的基礎上引入了帶權路徑長度(weighted path length,wpl)。一棵葉子結點帶權值(分支節點不帶權值)的二叉樹叫做擴充二叉樹。帶權值的結點均為葉子結點,不帶權值的均為分支節點(包括根結點),一棵擴充二叉樹(帶權二叉樹)的wpl最小,這麼一棵擴充二叉樹即為哈夫曼樹。下面說明什麼是wpl以及如何計算一棵擴充二叉樹的wpl:

wk是每乙個結點所帶的權值,lk是每乙個結點的路徑長度。某乙個外結點的帶權路徑長度為:這兩個值的乘積,一棵擴充二叉樹的帶權路徑長度則是所有乘積的和了。

二:如何構造一棵哈夫曼樹呢?

哈夫曼樹構造韓的核心思想就是:要把權值較大的放在離根結點較近的地方,採用自底向上的構造方式。在這裡我利用的是最小堆輔助實現的。

1:先來介紹一下我的最小堆吧:

#include#includeusing namespace std;

const int defaultsize = 10; //預設最小堆陣列元素的個數

templateclass minheap

;templatevoid minheap::siftdown(int begpos, int endpos)

if(temp <= heap[child_j])

else

}//end of while

heap[parent_i] = temp; //跳出迴圈後的parent_i就指向當前空缺的位置

}templatevoid minheap::siftup(int begpos)

else

}//end of while

heap[child_j] = temp;

}templatevoid minheap::display()

}templateminheap::~minheap()

templatebool minheap::insert(const t &elem)

templatebool minheap::isfull() const

templatevoid minheap::makeempty()

templateostream& operator<< (ostream &output, minheap&mh)

;

#include#include"city.h"

using namespace std;

city::city()

city::city(string name, int key)

city::~city()

ostream& operator<< (ostream &output, city &c)

ifstream& operator>> (ifstream &finput, city &c)

void city::operator= (city &c)

bool city::operator<= (city &c)

bool city::operator> (city &c)

上述自定義類更多的是過載輸入輸出以及運算子等。

下面是主函式呼叫:

city city[8]; //自定義類物件陣列

ifstream in("city.txt"); //物件都在檔案中

for(int i = 0; i < 8; i++)

minheapmheap(city, 8);

cout<

好了,先介紹到最小堆的實現,剩下的的在哈夫曼樹詳解續中介紹。

哈夫曼樹詳解

一 哈夫曼樹的定義 1 簡單路徑長度 所謂樹的簡單路徑長度,是指從樹的跟節點到每個節點的路徑長度之和。完全二叉樹是簡單路徑長度更小的二叉樹。2 加權路徑長度 所謂樹的加權路徑長度,是指樹中所以帶權 非0 葉節點的加權路徑長度之和。如下圖所示,不同的樹結構,加權路徑長度也不一樣。3 哈夫曼樹的定義 哈...

哈夫曼編碼 哈夫曼樹

1.定義 哈夫曼編碼主要用於資料壓縮。哈夫曼編碼是一種可變長編碼。該編碼將出現頻率高的字元,使用短編碼 將出現頻率低的字元,使用長編碼。變長編碼的主要問題是,必須實現非字首編碼,即在乙個字符集中,任何乙個字元的編碼都不是另乙個字元編碼的字首。如 0 10就是非字首編碼,而0 01不是非字首編碼。2....

哈夫曼樹 哈夫曼編碼

定義從a結點到b結點所經過的分支序列為從a結點到b結點的路徑 定義從a結點到b結點所進過的分支個數為從a結點到b結點的路徑長度 從二叉樹的根結點到二叉樹中所有結點的路徑長度紙盒為該二叉樹的路徑長度 huffman樹 帶權值路徑長度最小的擴充二叉樹應是權值大的外界點舉例根結點最近的擴充二叉樹,該樹即為...