不抬头的小猪 2018-11-20 11:16 采纳率: 50%
浏览 1426

构造哈夫曼树,传回权值最小的两个数s2的值错误,输入各节点权值始终不变?

#include
#include
using namespace std;
typedef char * HuffmanCode[];
typedef struct
{
int weight;
int parent, lch, rch;
}HTNode,*HuffmanTree;

void Select(HuffmanTree &HT, int k, int &s1, int &s2)
{
int temp=HT[1].weight;
for (int i = 1; i <= k; ++i)
{
if (HT[i].weight <= temp)
s1 = i;
else continue;
}
for (int j = 1; j <= k; ++j)
{
if ((HT[j].weight <= temp) && (HT[j].weight>=HT[s1].weight))
s2 = j;
else continue;
}
}

void CreatHuffmanTree(HuffmanTree &HT, int n)
{
int m;
int s1, s2;
if (n <= 1) return;
m = 2 * n - 1;
HT = new HTNode[m + 1];//0号单元未用,HT[m]表示根节点
for (int i = 1; i <= m; ++i)
{
HT[i].lch = 0;
HT[i].rch = 0;
HT[i].parent = 0;
}
for (int i = 1; i <= n; ++i)
{
cin >> HT[i].weight;
}

for (int i = n + 1; i <= m; ++i)
{
    Select(HT, i - 1, s1, s2);
    //在HT[k](1≤k≤i-1)中选择两个其双亲域为0,
    // 且权值最小的结点,
    // 并返回它们在HT中的序号s1和s2
    HT[s1].parent = i;
    HT[s2].parent = i;
    HT[i].lch = s1;
    HT[i].rch = s2;
    HT[i].weight = HT[s1].weight+HT[s2].weight;
}

}//构造哈夫曼树

void print(HuffmanTree HT, int n)
{
for (int i = 1; i <= 2*n-1; ++i)
{
cout << HT[i].weight<<" "<<HT[i].parent <<" "<< HT[i].lch << " "<< HT[i].rch << " "<< endl;
}
}

void main()
{
HuffmanTree HT;
int n;
cin >> n;
CreatHuffmanTree(HT, n);
print(HT, n);
}

  • 写回答

1条回答 默认 最新

  • zqbnqsdsmd 2018-11-21 13:43
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 thinkphp6配合social login单点登录问题
  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch