实验内容

已知某系统在通信联络中只可能出现n种字符,其概率从键盘输入。试创建哈夫曼树。

实验要求

1、从键盘输入n, 以及n个字符的概率。
例如:已知某系统在通信联络中只可能出现n种字符,其概率分别为 0.05, 0.29, 0.07, 0.08, 0.14, 0.23, 0.03, 0.11,试设计哈夫曼编码创建哈夫曼树。
2、用顺序存储。
3、输出结果如下
image.png
交作业时间:下次上机前

实验代码

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int n, m, s1, s2;
  4. typedef struct HTNode
  5. {
  6. int weight, parent, lchild, rchild, pos;
  7. bool operator<(const HTNode &a)const
  8. {
  9. return a.weight < weight;
  10. }
  11. }HTNode, *HuffmanTree;
  12. priority_queue<HTNode>P;
  13. void Select(HuffmanTree &HT, int ii, int &s1, int &s2)
  14. {
  15. HTNode t = P.top();
  16. s1 = t.pos;
  17. P.pop();
  18. t = P.top();
  19. s2 = t.pos;
  20. P.pop();
  21. }
  22. void CreateHuffmantree(HuffmanTree &HT, int n)
  23. {
  24. if(n <= 1)
  25. return;
  26. m = 2 * n - 1;
  27. HT = new HTNode[m + 1];
  28. for(int i = 1; i <= m; i++)
  29. {
  30. HT[i].parent = 0;
  31. HT[i].lchild = 0;
  32. HT[i].rchild = 0;
  33. }
  34. for(int i = 1; i <= n; ++i)
  35. {
  36. cin >> HT[i].weight;
  37. HT[i].pos = i;
  38. P.push(HT[i]);
  39. }
  40. for(int i = n + 1; i <= m; i++)
  41. {
  42. Select(HT, i - 1, s1, s2);
  43. HT[s1].parent = i;
  44. HT[s2].parent = i;
  45. HT[i].lchild = s1;
  46. HT[i].rchild = s2;
  47. HT[i].weight = HT[s1].weight + HT[s2].weight;
  48. HT[i].pos = i ;
  49. P.push(HT[i]);
  50. }
  51. }
  52. int main()
  53. {
  54. HuffmanTree HT;
  55. cout << "请输入哈夫曼树的叶子结点个数:";
  56. cin >> n;
  57. cout << "请输入每个叶子结点的权值:" << '\n';
  58. CreateHuffmantree(HT, n);
  59. for(int i = 1; i <= 2 * n - 1; ++i)
  60. {
  61. cout << "结点序号 " << i << " 权重 " << HT[i].weight
  62. << " parent " << HT[i].parent << " lchild " << HT[i].lchild
  63. << " rchild " << HT[i].rchild << '\n';
  64. }
  65. }

实验结果

image.png