すべてのデータ構造、アルゴリズムやアプリケーションカリキュラムのテンプレートをクリックしてください:https://blog.csdn.net/weixin_44077863/article/details/101691360
ハフマン木は、n外部ノードとバイナリツリー拡張の最小要件であり、WPL
この拡張は、バイナリツリーの葉空の拡張ではなく、オリジナルのnノードへの空気根の膨張は、空の葉と言うことです
WPL =ΣのWi * Liは、WPLは、経路長のリーフノード加重和を指し、合計は距離のルートを右点乗算され
アイデアは非常に単純なアルゴリズムであります
①遠く離れルートからになる権利近い、小さくも大きくなるようにルートから右
②リーフノードまで根が直接使用することができ、つまり、このルートのようにカウントアップを追加していき、根を合成するために一緒に右のポイントに、その後、この時点で右の増加に再び2つのノードまで行かなかった見つけます合成を行うために継続するため、このようなルートノード
だから、非常に単純な実装するとき
ポイントの束
2つの合成最小サブツリーを取り、ルートノードは、彼の息子の和であり、その後、バックサブツリーパイルポイントへ
これは、このポイントの杭と一点は、判断を下すために、他のポイントへのサブツリーのルートとして見ることができます
それとも、完全なツリーを閉じるまで、この操作を繰り返し、2つの一緒ルックを選出
たとえば、次のように
ハフマン木は、その後トークアプリケーションで、メッセージの暗号化の様相のために使用され、2進数の文字を表現します
どちらのあいまいさを表現作る、それが最短です
そして、周波数は、ハフマン木をすることができ構築するために簡単で、我々はバイナリ文字列、非常に単純な、それの例を見て書き出す文字に左右0 1対応を使用しました
ここでは、ハフマン木の成果のテンプレートコードを与え、基本的な操作の残りの部分は書いていません
一つのことは、n個のノードを見ているのn-1のマージに次男ツリー、よく理解する必要が言うのを忘れ、言うことはありません。
template <class T>
class Node{
public:
T x;
Node<T> *l,*r,*pa;
Node():l(0),r(0),pa(0){}
Node(T x,Node<T> *l=0,Node<T> *r=0,Node<T> *pa=0):x(x),l(l),r(r),pa(pa){}
};
template <class T>
class cmp{//注意如果堆里是对指针排序的话,Node里重载小于号就不好用了,你就必须得写cmp了
public:
bool operator()(Node<T> *a,Node<T> *b){
return a->x>b->x;
}
};
template <class T>
class HuffmanTree
{
private:
Node<T>* root; //Huffman树的树根
public:
HuffmanTree(T w[], int n);
void merge(Node<T> *a,Node<T> *b,Node<T>* pa);
};
template<class T>
void HuffmanTree<T>::merge(Node<T> *a,Node<T> *b,Node<T>* pa){
pa->x=a->x+b->x;
pa->l=a;
pa->r=b;
a->pa=pa;
b->pa=pa;
}
template<class T>
HuffmanTree<T>::HuffmanTree(T w[], int n){
priority_queue<Node<T>*,vector<Node<T>*>,cmp<T>> q;
Node<T> *pa,*a,*b,*tmp;
for(int i=0;i<n;i++){
tmp=new Node<T>(w[i]);
q.push(tmp);
}
for(int i=0;i<n-1;i++){
a=new Node<T>;
b=new Node<T>;
pa=new Node<T>;
a=q.top();q.pop();
b=q.top();q.pop();
merge(a,b,pa);
q.push(pa);
root=pa;
}
}