二叉樹實現哈夫曼碼

2021-07-10 21:06:49 字數 2002 閱讀 9080

最近完成乙個資料結構的作業,哈夫曼編碼,實現了

1.檢視字母的哈夫曼碼

2.哈夫曼碼轉文字

3.文字轉哈夫曼碼

這幾個功能

哈夫曼碼主要用於壓縮編碼,將字元用二進位制(0,1)編碼代替,能過使出現概率大的字母的二進位製碼短,而我們會根據字元的出現概率給各個字元賦乙個「權重」,再根據權重構造乙個二叉樹

核心便是如何構造這個哈夫曼二叉樹

那麼二叉樹的結點結構要有4個元素weight(權重),left(左孩子),right(右孩子),parent(雙親結點)

首先假設我們有乙個集合{2,4,5,3}即4個權重

1.選取兩個最小的權重(2,3)構成二叉樹最底部的葉子,它們的和是他們的parent

集合也就成了 {4,5,5}

2.重複第一步在4 ,5 ,5中選取兩個較小的(優先選取還未在樹上的4,5),集合變為{9,5}

3,重複以上二叉樹也就成了

talk is cheap,show you the code   //我的環境是vs2013

// 哈夫曼.cpp : 定義控制台應用程式的入口點。

//#include "fstream"

#include "iostream"

#include "string"

#define max 53

using namespace std;

double w[1000];

string low = "0";

string high = "1";

string code[1000];

class huffman_tree

private:

huffman_tree *left;

huffman_tree *right;

double weight;

int parent;

};void huffman_tree::choose(huffman_tree *h, int n, int &num_1, int &num_2) //給哈夫曼樹各個葉子結點選擇權重

} for (i = j; i < n; i++) }

for (int i = j; i < n; i++)

else if (h[i].weight < m2)

} }}

huffman_tree* huffman_tree::build_tree(huffman_tree* &h, double *number, int n) //構造哈夫曼樹

return &h[m - 1];

}void coding(huffman_tree *t, string code, int n) //給各個字母編碼

}coding(t->left, code, n);

code = temp;

code = code + high;

coding(t->right, code, n); }}

bool read_file() //從檔案中讀取各個字母的概率

if ((int)weight != 1)

else

return 1;

}void de_code(huffman_tree *t,string code,int &n) //哈夫曼碼轉文字的遞迴演算法,直接遞迴遍歷哈夫曼樹

}} else

else

} }}

void show_word(huffman_tree *root) // 哈夫曼轉文字遞迴演算法的呼叫程式

} if (temp == 2)

else if (i < 91)

else

n++; }}

void caidan() //由於是課程設計的作業,得有個給老師看的介面

int main()

system("pause");

} } return 0;

}

當然這個**寫得很渣,有一種c語言風格的c++,之後肯定會慢慢地改正過來

Java實現哈夫曼二叉樹

1 統計學生學分 學生考試結果 a b c d 學分增加 5 4 3 0 人數 10 50 30 10 1 if a 5 else if b 4 else if c 3 else d 0 這份 執行的效率為 10 50 2 30 3 10 3 2 if b 4 else if c 3 else if...

哈夫曼樹(最優二叉樹)

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

二叉樹與哈夫曼樹

1,二叉樹 二叉樹可以分為 完全二叉樹,滿二叉樹,哈夫曼樹 二叉樹的遍歷 遞迴 先序,中序,後序遍歷 二叉樹的結構 根節點,左子樹,右子樹 二叉樹的性質 1 如果二叉樹的節點個數為n,則父節點的個數為n 2 2 若2i 1 3 若2i 2 二叉樹的構建 構建二叉樹 public void creat...