首先是哈夫曼樹的定義:在一棵二叉樹中,帶權路徑長度達到最小,成這樣的樹是最優二叉樹,也是哈弗曼樹。大概意思就是把數值大的節點放在樹上面,數值小的節點放在樹下面。哈夫曼樹的結構使用順序結構,這裡直接使用了陣列。
建造哈弗曼樹的思路:根據二叉樹的性質,有n個葉子節點,二叉樹就會有2n-1個節點。定義乙個陣列,前n個節點作為葉子節點,從前n個節點中選擇兩個最小的節點,作為一棵二叉樹的左右節點,這棵二叉樹的根節點值為左右孩子節點值之和。把這個根節點的值放入陣列中,然後接著從陣列中(新加入的節點也算)選取兩個最小的節點,只不過把已經使用過的節點忽略掉,這樣不斷迴圈,每個節點和其他節點都有對應關係。
**實現:
定義結構體,裡面有四個成員,分別為權值,父節點,左孩子節點,右孩子節點,這裡的節點指的是他在陣列中對應的下標位置,如果是0則沒有父節點或者孩子節點,權值不能為0.
1 #include2 #include3 #include哈弗曼編碼:使出現頻率高的編碼放在上面,頻率低的編碼放在下面。4#define n 7
5#define m 2*n-1
6#define maxval 100
78 typedef struct
hufmtree;
1213 hufmtree *init()
2223
void sethuffmantree(hufmtree *tree)
37else
if(tree[j]->weight//
尋找次小權值的節點
38 s2 = tree[j]->weight;
39 p2 =j;40}
41 tree[p1]->parent = tree[p2]->parent = i; //
把兩個最小節點的父節點指向i
42 tree[i]->weight = tree[p1]->weight + tree[p2]->weight; //
父節點權值等於左右孩子權值之和
43 tree[i]->lchild = p1; //
指明父節點的左右孩子節點
44 tree[i]->rchild =p2;45}
4647}48
49void display(hufmtree *tree[n])
55 printf("\n"
);56 }
以上圖為例,其中a的頻率最高,離根節點最近,gfed頻率最低,在最下面。
1void createhuffmancode(hufmtree *tree[n])
20 printf("
%d:%s \n
",tree[i]->weight,&temp[start]);21}
2223}24
25void
main();
2930
//分配空間
31for(i=0;i)
32 tree[i] =init();
3334
//陣列每個節點內的所有值初始化時都設為0
35for(i=0;i)
4142
//為陣列前n個數的權值賦值
43for(i=0;i)
44 tree[i]->weight =num[i];
4546
sethuffmantree(tree);
4748
display(tree);
4950
createhuffmancode(tree);
5152 }
哈夫曼樹及其編碼
include include include includeusing namespace std define ok 1 define error 0 define true 1 define false 0 typedef int status 定義哈夫曼樹結點 typedef struct ...
哈夫曼編碼 哈夫曼樹
1.定義 哈夫曼編碼主要用於資料壓縮。哈夫曼編碼是一種可變長編碼。該編碼將出現頻率高的字元,使用短編碼 將出現頻率低的字元,使用長編碼。變長編碼的主要問題是,必須實現非字首編碼,即在乙個字符集中,任何乙個字元的編碼都不是另乙個字元編碼的字首。如 0 10就是非字首編碼,而0 01不是非字首編碼。2....
哈夫曼樹 哈夫曼編碼
定義從a結點到b結點所經過的分支序列為從a結點到b結點的路徑 定義從a結點到b結點所進過的分支個數為從a結點到b結點的路徑長度 從二叉樹的根結點到二叉樹中所有結點的路徑長度紙盒為該二叉樹的路徑長度 huffman樹 帶權值路徑長度最小的擴充二叉樹應是權值大的外界點舉例根結點最近的擴充二叉樹,該樹即為...