1、哈夫曼樹的構建原理如下
2、構建哈夫曼樹以及編碼的步驟
哈夫曼編碼步驟:
一、對給定的n個權值構成n棵二叉樹的初始集合f= ,其中每棵二叉樹ti中只有乙個權值為wi的根結點,它的左右子樹均為空。(為方便在計算機上實現算 法,一般還要求以ti的權值wi的公升序排列。)
二、在f中選取兩棵根結點權值最小的樹作為新構造的二叉樹的左右子樹,新二叉樹的根結點的權值為其左右子樹的根結點的權值之和。
三、從f中刪除這兩棵樹,並把這棵新的二叉樹同樣以公升序排列加入到集合f中。
四、重複二和三兩步,直到集合f中只有一棵二叉樹為止。
簡易的理解就是,假如我有a,b,c,d,e五個字元,出現的頻率(即權值)分別為5,4,3,2,1,那麼我們第一步先取兩個最小權值作為左右子樹構造乙個新樹,即取1,2構成新樹,其結點為1+2=3,如圖:
虛線為新生成的結點,第二步再把新生成的權值為3的結點放到剩下的集合中,所以集合變成,再根據第二步,取最小的兩個權值構成新樹,如圖:
再依次建立哈夫曼樹,如下圖:
其中各個權值替換對應的字元即為下圖:
所以各字元對應的編碼為:a->11,b->10,c->00,d->011,e->010
霍夫曼編碼是一種無字首編碼。解碼時不會混淆。其主要應用在資料壓縮,加密解密等場合。
**如下:
// huffman.cpp : 定義控制台應用程式的入口點。
//#include "stdafx.h"
#include #include #include #include #include using namespace std;
class node
bool operator
};void initnode(priority_queue&q, int nodenum)
}void shownode(priority_queueq)
}//構造哈夫曼樹
void huffmantree(priority_queue&q)
}// 列印哈夫曼編碼
void huffmancode(node *root, string &prefix, map&result)
void testresult(mapresult)
}int main()
哈夫曼樹的建立以及哈夫曼編碼
主要源 如下 include include define max num 105 typedef struct htnode,htree void selecttwomin htree ht,int n,int s1,int s2 ht s1 visited 1 將最小的頻率對應的結點標記為已被訪...
哈夫曼編碼 哈夫曼樹
1.定義 哈夫曼編碼主要用於資料壓縮。哈夫曼編碼是一種可變長編碼。該編碼將出現頻率高的字元,使用短編碼 將出現頻率低的字元,使用長編碼。變長編碼的主要問題是,必須實現非字首編碼,即在乙個字符集中,任何乙個字元的編碼都不是另乙個字元編碼的字首。如 0 10就是非字首編碼,而0 01不是非字首編碼。2....
哈夫曼樹 哈夫曼編碼
定義從a結點到b結點所經過的分支序列為從a結點到b結點的路徑 定義從a結點到b結點所進過的分支個數為從a結點到b結點的路徑長度 從二叉樹的根結點到二叉樹中所有結點的路徑長度紙盒為該二叉樹的路徑長度 huffman樹 帶權值路徑長度最小的擴充二叉樹應是權值大的外界點舉例根結點最近的擴充二叉樹,該樹即為...