哈夫曼树的构造

来源:互联网 发布:爱奇艺视频软件 编辑:程序博客网 时间:2024/05/29 12:30

Huffman_encoding (s,f)

input:s(字符串)和f(字频数组)

output:T(S的哈夫曼树)

begin:

insert all characters into a heap H according to their frequncy

while H is not empty do

    if H contains only only character X then

         make X the root of T

   else

       pick two characters X and Y with lowest frequencies

             and delete them from h;

     replace X and Y with a new character Z whose frequency is

          the sum of the frequencies of X and Y

     insert  Z  to H

    make X and Y children of   Z in T

end

代码如下:题意如下:6个字符A B C D E F,其字频分别为 5 2 3 4 10 1  它们的哈夫树的构造。

代码:

 

// 哈弗曼编码.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>using namespace std;int K =0;//当前堆的大小 从0开始的class NODE{public: NODE *left; NODE *right; int value;bool operator<(const NODE &other)const//按x排序的时候能用到       {          return value<other.value;      }  const NODE& operator=(NODE &b){left=b.left;right=b.right;value=b.value;return *this;}bool operator==(NODE &b){return value==b.value;}};void build_heap(NODE arr[],int n,NODE x)//建最小堆{arr[n]=x;NODE tmp=x;if(n==0){cout<<"n--"<<n<<"----";cout<<tmp.value<<endl;return;}while(n>0){if(tmp<arr[((n+1)/2)-1]){ arr[n]=arr[((n+1)/2)-1];n=((n+1)/2)-1;}else break;}if(n>=0)arr[n]=tmp;cout<<"n--"<<n<<"----";cout<<tmp.value<<endl;}void delete_heap_1(NODE arr[],NODE x)//调整从堆顶元素{int j;NODE t;arr[0]=x;int i=0;while(i<K)//还有孩子{j=2*i+1;if(j>=K) break;if((arr[j+1]<arr[j])&&(j+1<K)) j=j+1;//if((arr[i]<arr[j])||(arr[i]==arr[j])) break;if(arr[j]<arr[i]){t=arr[j];arr[j]=arr[i];arr[i]=t;i=j;}else break;}}int _tmain(int argc, _TCHAR* argv[]){NODE node[6];NODE arr[20];int i;for(i=0;i<20;i++){arr[i].left=NULL;arr[i].right=NULL;arr[i].value=-1;}for(i=0;i<6;i++){node[i].left=NULL;node[i].right=NULL;}node[0].value=5;node[1].value=2;node[2].value=3;node[3].value=4;node[4].value=10;node[5].value=1;for(i=0;i<6;i++)build_heap(arr,i,node[i]);K=5;/*for(i=5;i>=0;i--){cout<<"----------"<<endl;cout<<arr[0].value<<endl;delete_heap_1(arr,arr[i]);K--;}*/cout<<arr[0].value<<endl;NODE *root=new NODE();root->right=NULL;root->right=NULL;root->value=-1;while(K>=0){if(K==0)//只有一个元素{root=&arr[0];break;}else{NODE x;x=arr[0];cout<<endl<<endl;cout<<"x----"<<x.value<<endl;delete_heap_1(arr,arr[K]);K--;NODE y;y=arr[0];delete_heap_1(arr,arr[K]);K--;cout<<"y----"<<y.value<<endl;NODE z;z.left=&x;z.right=&y;z.value=x.value+y.value;cout<<"z---"<<z.value<<endl;cout<<endl<<endl;K++;build_heap(arr,K,z);}}cout<<"value=="<<root->value<<endl;return 0;}