哈夫曼樹哈夫曼編碼
阿新 • • 發佈:2021-11-24
輸入一組整型權值,構建哈夫曼樹,實現哈夫曼編碼,並輸出帶權路徑長度。
輸入格式:
第一行輸入葉子結點個數,接著依次輸入權值。
輸出格式:
輸出哈夫曼編碼,輸出帶權路徑長度。
輸入樣例:
在這裡給出一組輸入。例如:
8
5 29 7 8 14 23 3 11
結尾無空行
輸出樣例:
在這裡給出相應的輸出。例如:
5編碼為0001
29編碼為10
7編碼為1110
8編碼為1111
14編碼為110
23編碼為01
3編碼為0000
11編碼為001
WPL:271
#include<iostream> #include<cstdio> using namespace std; constint N=100010; struct node{ int num,fa,ch; }; bool st[N]; int n; node* nodes; int find(int n){ int p=0; for(int i=1;i<=n;i++){ if(st[i]==0&&(p==0||nodes[i].num<nodes[p].num)){ p=i; } } return p; } void add(int lc,int rc,int p){ nodes[lc].fa=p; nodes[lc].ch=-1; nodes[rc].fa=p; nodes[rc].ch=1; nodes[p].num=nodes[lc].num+nodes[rc].num; } string huffman(int k){ string s; if(nodes[k].fa){ s=huffman(nodes[k].fa); } if(nodes[k].ch){ s+=nodes[k].ch==-1?"0":"1"; } return s; } int main(){ cin>>n; nodes=new node[2*n]; for(int i=1;i<=n;i++){ cin>>nodes[i].num; } if(n==1||n==0){ cout<<"error"; }else{ int l=n+1,r=2*n-1; while(l<=r){ int c1=find(l-1); st[c1]=1; int c2=find(l-1); st[c2]=1; add(c1,c2,l++); } int wpl=0; for(int i=1;i<=n;i++){ string s=huffman(i); cout<<nodes[i].num<<"編碼為"<<s<<endl; wpl+=nodes[i].num*s.size(); } cout<<"WPL:"<<wpl; } return 0; }