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

文章/文档

开发平台:

C/C++

  1. #include<iostream.h>
  2. #include<iomanip.h>
  3. #define Max 21
  4. typedef struct  //Huffman树的结点结构
  5. {
  6. char data;  //结点值
  7. int weight;  //权值
  8. int parent;  //双亲结点下标
  9. int left;  //左孩子下标
  10. int right;  //右孩子下标
  11. }HuffNode;
  12. typedef struct  //存放Huffman编码的数组元素结构
  13. {
  14. char cd[Max];  //数组
  15. int start;  //编码的起始下标
  16. }HuffCode;
  17. void main()
  18. {
  19. HuffNode ht[2*Max];  //n个叶子结点的Huffman树共2n-1个结点
  20. int i,k,l,r,n,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. cout<<"结点值  "<<"双亲值  "<<"权重  "<<"左孩子  "<<"右孩子  "<<endl;
  57. for (i=1;i<=2*n-1;i++)
  58. cout<<setw(2)<<ht[i].data<<setw(8)<<ht[i].parent<<setw(8)<<ht[i].weight
  59. <<setw(8)<<ht[i].left<<setw(8)<<ht[i].right<<endl;
  60. }