DS二叉樹 赫夫曼樹的構建與編碼

2021-08-29 18:35:35 字數 946 閱讀 6743

題目描述 給定n個權值,根據這些權值構造huffman樹,並進行huffman編碼

參考課本演算法,注意陣列訪問是從位置1開始

要求:赫夫曼的構建中,預設左孩子權值不大於右孩子權值

輸入 第一行輸入t,表示有t個測試例項 第二行先輸入n,表示第1個例項有n個權值,接著輸入n個權值,權值全是小於1萬的正整數 依此類推

樣例輸入

1 5 15 4 4 3 2

樣例輸出

15-1

4-010

4-011

3-001

2-000

#include#include#includeusing namespace std;

const int maxw= 9999;

class huffnode;

class huffman

}void selectmin(int pos, int *s1, int *s2)

else if(w2> hufftree[i].weight&&!hufftree[i].parent)}}

public:

int len;

int lnum;

huffnode *hufftree;

string *huffcode;

void maketree(int n, int wt)

maketree();

}void coding()

else

huffcode[i].assign(&cd[start]);

}

delete cd;

}void destroy()};

int main()

myhuff.destroy();

}return 0;

}

赫夫曼樹(最優二叉樹) 赫夫曼編碼

首先我們看一下相關的一些概念。路徑長度 從樹中乙個節點到另外乙個節點之間的分支構成兩個節點之間的路徑,路徑上的分支數目稱為路徑長度。如圖中的數字就為路徑長度。樹的路徑長度就是從樹根到每乙個節點的路徑的長度總和。上圖二叉樹的樹路徑長度為1 1 2 2 2 2 3 3 16。那麼根據這樣可以得出當節點一...

構造赫夫曼樹(最優二叉樹)

例如,有權值分別為 5 10 15 20 25 40的結點,根據以上演算法構造出乙個哈夫曼樹。取這六個樹中最小的兩個樹5 10連成乙個二叉樹,其權值為15 此時森林裡的樹變為15 5 10 15 20 25 40。取這五個樹中最小的兩個樹 15 5 10 15 構成乙個新的二叉樹30 5 10 15...

二叉樹的應用 堆排序, 赫夫曼樹

赫夫曼樹 堆排序是利用堆這種資料結構而設計的排序演算法,堆排序是一種選擇排序,最壞 最好 平均時間複雜度均為o nlogn 堆是具有以下性質的完全二叉樹 每個節點的值都大於或等於其左右孩子節點的值,稱為大頂堆。不要求節點左右孩子的大小關係。每個節點的值都小於或等於其左右孩子節點的值,稱為小頂堆。以大...