二叉樹的帶權路徑長度
二叉樹中所有葉子結點的帶權路徑長度之和
根到結點的路徑長度
從根到結點的路徑上的分支數
哈夫曼樹二叉樹
又稱最優二叉樹,是一帶權路徑長度最短的二叉樹。
例:設結點a、b、c、d的權值分別為1、3、5、7,所以,那麼問題來了。二叉樹(1)的帶權路徑長度=31+33+25+17=29
二叉樹(2)的帶權路徑長度=21+23+25+27=32
二叉樹(3)的帶權路徑長度=21+33+35+17=33
在所有可以構建的二叉樹中,(1)的帶權路徑長度是最短,所以(1)是最優二叉樹。
怎麼構建哈夫曼樹呢?
根據給定的n個權值構成n棵二叉樹的集合f=,其中每棵二叉樹只含乙個帶權的根結點,其左右子樹均空;
在f中選兩棵根結點的權值最小的二叉樹作為左右子樹,構造一棵新的二叉樹,且置新的二叉樹的根結點的權值為其左、右子樹上根結點的權值之和;
在f中刪除這兩棵二叉樹,同時將新得到的二叉樹加入f ;
重複2和3,直到f只含一棵二叉樹,此即最優二叉樹。
**如下:
//ht為哈夫曼樹,min為一結構體的命名。
for(
int i = num +
1; i <= m; i++
)
輸入一串字元,將他們用哈夫曼碼的形式輸出。
string estring;
//建立乙個字串型別的資料,用於儲存哈夫曼碼
for(
int i =
0;i <= s.
size()
; i++)}
}
選中要編譯字串中的乙個字元;
將選中的字元與哈夫曼樹中的每個字元進行對比;
若兩字元相等,則將哈夫曼中字元的哈夫曼碼連線至estring(要輸出的字串)後。
待要編譯的字串全部編譯完成,則輸出estring。
輸入一串哈夫曼碼,將其解碼變成一串字元。
string estring;
//建立乙個字串型別的資料,用於儲存解碼得出的字元
int pos =
0, first =0;
for(
int x =
0; x <= s.
size()
; x++)}
}
輸入一串哈夫曼碼;
將first指向第乙個字元,代表從這個字元開始,pos賦值為1(代表選取乙個字元),將選取得到的字元與哈夫曼樹中的每個哈夫曼碼進行對比;
如果兩字元相等,將此哈夫曼碼相對應的字元直接輸出,first 指向pos+first字元處,pos變為1;若不相等,pos+1,接著進行比較。
直到解碼結束。
#include
#include
#include
using
namespace std;
//哈夫曼樹的儲存結構
typedef
struct
htnode,
*huffmantree;
//兩個最小結點
typedef
struct
min;
//選擇結點權值最小的兩個結點
min select
(huffmantree ht,
int n)
}for
(int i =
1; i <= n; i++)}
code.s1 = s1;
code.s2 = s2;
return code;
}//將哈夫曼碼儲存在結構體num中
void
putlorinnum
(huffmantree &hft,
int num)}}
//創造哈夫曼樹
void
createhuffmantree
(huffmantree &ht,
int num)
cout <<
"請輸入每個資料及其權值:"
<< endl;
for(
int i =
1; i <= num; i++
)for
(int i = num +
1; i <= m; i++
)//構建哈夫曼樹
putlorinnum
(ht, m)
;for
(int i =
1; i <= m; i++
)//進行每個字元哈夫曼碼的輸出}}
//將一串字元編譯成哈夫曼碼
void
changchartohft
(huffmantree hft, string s,
int m)}}
cout<
return;}
//將一串哈夫曼碼解譯成一串字元
void
changhfttochar
(huffmantree hft, string s,
int m)}}
cout<
}int
main()
else
if(q==2)
else
break;}
return0;
}
此程式在code::blocks上可成功執行。
輸入輸出形式如上圖。
c 哈夫曼樹的建立 編碼 解碼
哈夫曼樹的建立和編碼 include includeusing namespace std typedef struct hthtnode,huffmantree typedef char huffmancode void select huffmantree ht,int k,int s1,int...
哈夫曼樹樹生成及編碼解碼
哈夫曼編碼 time limit 1000 2000 ms c others memory limit 32768 32768 k c others problem description 由若干個值無重複的結點及其權值,建立相應的哈夫曼樹。在合併過程中,若出現權值相同的情況,則優先選取編號小的進行...
哈夫曼樹及哈夫曼編碼
哈夫曼樹,最優二叉樹,帶權路徑長度 wpl 最短的樹。它沒有度為1的點,是一棵嚴格的二叉樹 滿二叉樹 了解哈夫曼樹,我們首先要知道樹的幾個相關術語,並了解什麼是wpl。注 樹的wpl這個概念非常重要,這個公式直接產生了哈夫曼編碼資料壓縮的應用 根據給定的n個權值構成n棵二叉樹的集合f 其中每棵二叉樹...