InitHTree(HTree \\&HT, int *w, int n)——初始化赫夫曼树,其中w和n分别是权重数组和叶子结点数。要求根据定义的赫夫曼树结构,申请一个由2n-1个元素组成的一维数组HT,HT[0..n-1]存放n个叶子结点的权重和结点数,
时间: 2024-02-28 17:57:42 浏览: 107
HT[n..2n-2]则存放n-1个非叶子结点的信息,具体来说,HT[i].weight表示第i个结点的权重,HT[i].parent表示第i个结点的双亲结点下标,HT[i].lchild表示第i个结点的左孩子结点下标,HT[i].rchild表示第i个结点的右孩子结点下标。下面是InitHTree函数的代码实现:
```
typedef struct {
int weight; // 结点权重
int parent; // 双亲结点下标
int lchild; // 左孩子结点下标
int rchild; // 右孩子结点下标
} HTNode, *HTree;
void InitHTree(HTree &HT, int *w, int n) {
int m = 2 * n - 1;
HT = new HTNode[m]; // 动态申请数组空间
for (int i = 0; i < n; i++) {
HT[i].weight = w[i];
HT[i].parent = -1;
HT[i].lchild = -1;
HT[i].rchild = -1;
}
for (int i = n; i < m; i++) {
HT[i].weight = 0;
HT[i].parent = -1;
HT[i].lchild = -1;
HT[i].rchild = -1;
}
}
```
在InitHTree函数中,首先计算出赫夫曼树的结点总数m,然后动态申请一个大小为m的数组HT。接着,将前n个元素的权重值设置为w数组中对应元素的值,将它们的parent、lchild和rchild分别初始化为-1,表示它们都是叶子结点。最后,将HT数组中剩余的n-1个元素的weight、parent、lchild和rchild分别初始化为0和-1,表示它们是非叶子结点,但暂时还没有连接到赫夫曼树中。
阅读全文