5_48.cpp
上传用户:zipjojo
上传日期:2009-07-20
资源大小:70k
文件大小:2k
源码类别:

文章/文档

开发平台:

C/C++

  1. #include<iostream.h>
  2. #define Max 21
  3. typedef struct  //Huffman树的节点结构
  4. {
  5. char data;  //节点值
  6. int weight;  //权值
  7. int parent;  //双亲节点下标
  8. int left;  //左孩子下标
  9. int right;  //右孩子下标
  10. }HuffNode;
  11. typedef struct  //存放Huffman编码的数组元素结构
  12. {
  13. char cd[Max];  //数组
  14. int start;  //编码的起始下标
  15. }HuffCode;
  16. void main()
  17. {
  18. HuffNode ht[2*Max];  //n个叶子节点的Huffman树共2n-1个节点
  19. HuffCode hcd[Max],d;
  20. int i,k,f,l,r,n,c,m1,m2;
  21. cout<<"元素个数:";
  22. cin>>n;
  23. for(i=1;i<=n;i++)
  24. {
  25. cout<<"第"<<i<<"个元素=>t节点值:";
  26. cin>>ht[i].data;
  27. cout<<"tt权  重:";
  28. cin>>ht[i].weight;
  29. }
  30. for (i=1;i<=2*n-1;i++)  //n个叶子节点共有2n-1个节点
  31. ht[i].parent=ht[i].left=ht[i].right=0;  //初值为0
  32. for (i=n+1;i<=2*n-1;i++)  //构造Huffman树,每次循环构造一棵二叉树
  33. {
  34. m1=m2=32767;  //设定初值,用于求最小权重节点
  35. l=r=0;  //l和r为最小权重的两个节点位置
  36. for(k=1;k<=i-1;k++)  //每次找出权值最小的两个节点
  37. if(ht[k].parent==0)
  38. if(ht[k].weight<m1)
  39. {
  40. m2=m1;
  41. r=l;
  42. m1=ht[k].weight;
  43. l=k;
  44. }
  45. else if(ht[k].weight<m2)
  46. {
  47. m2=ht[k].weight;
  48. r=k;
  49. }
  50. ht[l].parent=i;  //给双亲节点编号
  51. ht[r].parent=i;
  52. ht[i].weight=ht[l].weight+ht[r].weight;  //双亲节点权重
  53. ht[i].left=l;  //左孩子为l
  54. ht[i].right=r;  //右孩子为r
  55. }
  56. for (i=1;i<=n;i++)  //根据Huffman树求编码
  57. {
  58. d.start=n+1;
  59. c=i;
  60. f=ht[i].parent;
  61. while(f!=0)  //由叶子节点向上直到根节点
  62. {
  63. if(ht[f].left==c)
  64. d.cd[--d.start]='0';  //左孩子节点编码为0
  65. else 
  66. d.cd[--d.start]='1';
  67. c=f;
  68. f=ht[f].parent;
  69. }
  70. hcd[i]=d;
  71. }
  72. cout<<"输出Huffman编码:n";
  73. for (i=1;i<=n;i++)  //输出叶子节点的Huffman编码
  74. {
  75. cout<<"  "<<ht[i].data<<":";
  76. for(k=hcd[i].start;k<=n;k++)
  77. cout<<hcd[i].cd[k];
  78. cout<<endl;
  79. }
  80. }