(01) 路徑和路徑長度
定義:在一棵樹中,從乙個結點往下可以達到的孩子或孫子結點之間的通路,稱為路徑。通路中分支的數目稱為路徑長度。若規定根結點的層數為1,則從根結點到第l層結點的路徑長度為l-1。
例子:100和80的路徑長度是1,50和30的路徑長度是2,20和10的路徑長度是3。
(02) 結點的權及帶權路徑長度
定義:若將樹中結點賦給乙個有著某種含義的數值,則這個數值稱為該結點的權。結點的帶權路徑長度為:從根結點到該結點之間的路徑長度與該結點的權的乘積。
例子:節點20的路徑長度是3,它的帶權路徑長度= 路徑長度 * 權 = 3 * 20 = 60。
(03) 樹的帶權路徑長度
定義:樹的帶權路徑長度規定為所有葉子結點的帶權路徑長度之和,記為wpl。
例子:示例中,樹的wpl= 1*100 + 2*80 + 3*20 + 3*10 = 100 + 160 + 60 + 30 = 350。
哈夫曼樹又稱最優二叉樹。它是 n 個帶權葉子結點構成的所有二叉樹中,帶權路徑長度 wpl 最小的二叉樹。
哈夫曼樹的構造過程:
哈夫曼編碼
規定哈夫曼樹中的左分支為0,右分支為1,則從根結點到每個葉結點所經過的分支對應的0和1組成的序列便為該結點對應字元的編碼。這樣的編碼稱為哈夫曼編碼
注意:在一組字元的哈夫曼編碼中,不可能出現乙個字元的哈夫曼編碼是另乙個字元哈夫曼編碼的字首。
測試**
1 #include2 #include3#define n 50
4#define m 2*n - 1
5 typedef struct
6htnode;
1314 typedef struct
15hcode;
1920
void createht(htnode ht, int
n)21
40else
if (ht[k].weight
4145
}46 ht[node1].parent = i; //
合併兩個最小的和次小的節點
47 ht[node2].parent =i;
48 ht[i].weight = ht[node1].weight +ht[node2].weight;
49 ht[i].lchild =node1;
50 ht[i].rchild =node2;51}
52}5354
void createhcode(htnode ht, hcode hcd, int
n)55
72 hc.start++;
73 hcd[i] =hc;74}
75}7677
void disphcode(htnode ht, hcode hcd, int
n)78
90 printf("\n"
);91 m +=ht[i].weight;
92 sum += ht[i].weight*j;93}
94 printf("
\n平均長度 = %g\n
", 1.0 * sum /m);95}
9697
intmain()
98; //
節點值101
int fnum = ; //
權重102
htnode ht[m];
103hcode hcd[m];
104for (i = 0; i < n; ++i)
105109
110 createht(ht, n); //
建立哈夫曼樹
111 createhcode(ht, hcd, n); //
構造哈夫曼編碼
112 disphcode(ht, hcd, n); //
輸出哈夫曼編碼
113return0;
114 }
二叉樹與哈夫曼樹
1,二叉樹 二叉樹可以分為 完全二叉樹,滿二叉樹,哈夫曼樹 二叉樹的遍歷 遞迴 先序,中序,後序遍歷 二叉樹的結構 根節點,左子樹,右子樹 二叉樹的性質 1 如果二叉樹的節點個數為n,則父節點的個數為n 2 2 若2i 1 3 若2i 2 二叉樹的構建 構建二叉樹 public void creat...
哈夫曼樹(最優二叉樹)
給定n個權值作為n的 葉子結點,構造一棵二叉樹,若帶權路徑長度達到最小 所謂樹的帶權路徑長度,就是樹中所有的葉結點 的權值乘上其到根結點的路徑長度 稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹 huffman tree 哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。假設有n個權值,則構造出的...
哈夫曼樹及二叉樹
一 昨天寫了個哈夫曼樹,其實難到不難,重點是利用標準庫里的優先佇列就很好辦了 哈夫曼樹主要是建立個最小堆,求最小加權路徑,就是求哈夫曼樹中非葉子結點的權值和 include priority queueq 這個是最大堆 最小堆這樣寫 priority queue,greater q 另外,用vs20...