算法与数据结构——哈夫曼树哈夫曼编码
题目:
代码:
#include<iostream> #include<cstdio> using namespace std; const int 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;//不能赋0的原因是全局变量不赋值,默认是0 nodes[rc].fa=p; nodes[rc].ch=1; nodes[p].num=nodes[lc].num+nodes[rc].num; } //huffman编码 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; }
参考:哈夫曼树哈夫曼编码 - 清梦韶华 - 博客园 (cnblogs.com)
#include<iostream>#include<cstdio>using namespace std;const int 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;//不能赋0的原因是全局变量不赋值,默认是0 nodes[rc].fa=p; nodes[rc].ch=1; nodes[p].num=nodes[lc].num+nodes[rc].num;}//huffman编码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;}