寫的比較亂(哈哈),但是理解起來應該還好
//哈夫曼構建
#define n 50 //葉子節點個數
//哈夫曼重點在於它是用陣列儲存結構的,也是用陣列序列化(構建)的
//它需要乙個指明節點權值陣列和節點自身字元陣列的就可以了
//然後通過哈夫曼規則構建有父節點和左右孩子節點的結構體陣列,這就是哈夫曼
//所以就沒有用到鍊錶指標
typedef struct node
huffmantree[2*n];
//1.對於huffman這個陣列,(0不用)前n項是葉子節點,後面n-1是非葉子節點
//2.所以首先是要初始化前n項葉子節點(也可以稱為樹)(主要初始化權值 weight 和其自身字元 ch,parent 和 child節點指向0 )
//3.其次初始化後n-1項非葉子節點(parent 和 child節點指向0)
//4.然後用這些葉子節點初始化後面的非葉子節點(如果設當前非葉子節點的下標為i,那麼可以從0到i-1範圍內循尋找最小權值的兩個節點(訪問過的節點可以用標誌位標記為1),所以找到的條件是找到的兩個節點是在前面節點中最小的且沒有被標記的)
//5.初始化非葉子節點過程中,對於葉子節點要指明其父親節點下標,對於非葉子節點要指明其左右孩子下標還有其權值是兩個孩子權值之和
//哈夫曼的編碼
typedef char* huffmancode[n+1]
//從其定義可知哈夫曼編碼是乙個字元指標陣列,陣列中的每個成員便是每個節點的編碼了,
//由於它是變長的,所以設其為指標變數
//由哈夫曼自身規律可知編碼的最大長度為n-1,即非葉子節點個數
//我們容易想到求各個葉子節點的編碼可以逆推,從葉子節點一直推到根節點即可(編碼可規定為:左孩子為0,右孩子為1)
//因為我們的葉子節點是儲存在前n項陣列中的,所以遍歷前n項即可
//遍歷也很簡單,首先對於當前節點i我們要取出其父節點f,(在哈夫曼樹中只有根節點沒有父節點,只有葉子節點沒有孩子),所以只要夫節點
//為空說明乙個節點編碼完成),然後就判斷啊,f節點的做孩子是i的話就編碼置為0,如果不是就置為1
//因為是逆推,所以字元指標可以分配一塊有n個單位的位址,然後逆向賦值,這就ok了。
哈夫曼編碼 哈夫曼樹
1.定義 哈夫曼編碼主要用於資料壓縮。哈夫曼編碼是一種可變長編碼。該編碼將出現頻率高的字元,使用短編碼 將出現頻率低的字元,使用長編碼。變長編碼的主要問題是,必須實現非字首編碼,即在乙個字符集中,任何乙個字元的編碼都不是另乙個字元編碼的字首。如 0 10就是非字首編碼,而0 01不是非字首編碼。2....
哈夫曼樹 哈夫曼編碼
定義從a結點到b結點所經過的分支序列為從a結點到b結點的路徑 定義從a結點到b結點所進過的分支個數為從a結點到b結點的路徑長度 從二叉樹的根結點到二叉樹中所有結點的路徑長度紙盒為該二叉樹的路徑長度 huffman樹 帶權值路徑長度最小的擴充二叉樹應是權值大的外界點舉例根結點最近的擴充二叉樹,該樹即為...
哈夫曼編碼 哈夫曼樹
哈夫曼樹是乙個利用權值進行優化編碼的乙個比較奇怪的樹,他的實現比較簡單,用途也比較單一。哈夫曼樹的實現,實現要求 通過哈夫曼樹可以保證在編碼過程中不會出現例如 1000和100這樣的編碼規則,否則就會編碼失敗,因為1000和100在某些情況下的編碼會一模一樣。通過哈夫曼樹可以保證權值大的值進行編碼時...