2019316哈夫曼树权值问题

 

#include<iostream>
#include<queue>

using namespace std;

int main()
{
    int n=5;
    int a[5]={1,2,2,5,9};
    priority_queue<int,vector<int>,greater<int> > q; //小根堆
    for(int i=0;i<n;i++) q.push(a[i]);//压入小根堆

    int a1,a2,ax,sum=0;
    while(!q.empty())
    {
        a1=q.top();q.pop();
        if(q.empty()) break;
    else {a2=q.top();q.pop();}
    //取出两个最小的元素
    ax=a1+a2;sum+=ax;q.push(ax);

    }

    cout<<sum;









    return 0;
}

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个基于数组的哈夫曼树权值实现的示例代码,供您参考: ```c #include <stdio.h> #define MAX_NODE_NUM 1000 // 哈夫曼树节点结构体 typedef struct { int weight; // 权值 int parent; // 父节点 int leftChild; // 左孩子 int rightChild; // 右孩子 } HuffmanNode; // 构建哈夫曼树 void createHuffmanTree(HuffmanNode huffmanTree[], int weight[], int n) { int i, j, k; int min1, min2; // 初始化哈夫曼树 for (i = 0; i < 2 * n - 1; i++) { huffmanTree[i].parent = -1; huffmanTree[i].leftChild = -1; huffmanTree[i].rightChild = -1; } // 设置叶子节点的权值 for (i = 0; i < n; i++) { huffmanTree[i].weight = weight[i]; } // 构建哈夫曼树 for (i = 0; i < n - 1; i++) { min1 = min2 = MAX_NODE_NUM; k = 0; // 查找权值最小的两个节点 for (j = 0; j < n + i; j++) { if (huffmanTree[j].parent == -1 && huffmanTree[j].weight < min1) { min2 = min1; min1 = huffmanTree[j].weight; k = j; } else if (huffmanTree[j].parent == -1 && huffmanTree[j].weight < min2) { min2 = huffmanTree[j].weight; } } // 设置父节点 huffmanTree[k].parent = n + i; huffmanTree[n + i].weight = min1 + min2; // 设置左孩子和右孩子 for (j = 0; j < n + i; j++) { if (huffmanTree[j].parent == -1) { if (huffmanTree[j].weight == min1) { huffmanTree[j].parent = n + i; huffmanTree[n + i].leftChild = j; } else if (huffmanTree[j].weight == min2) { huffmanTree[j].parent = n + i; huffmanTree[n + i].rightChild = j; } } } } } int main() { int i; int weight[] = {5, 6, 8, 7, 15}; int n = sizeof(weight) / sizeof(weight[0]); HuffmanNode huffmanTree[MAX_NODE_NUM]; // 构建哈夫曼树 createHuffmanTree(huffmanTree, weight, n); // 输出哈夫曼树权值 printf("Huffman Tree Weight:\n"); for (i = 0; i < 2 * n - 1; i++) { printf("%d ", huffmanTree[i].weight); } printf("\n"); return 0; } ``` 在这个代码中,`HuffmanNode` 结构体表示哈夫曼树的节点,包含权值、父节点、左孩子和右孩子等信息。`createHuffmanTree` 函数用于构建哈夫曼树,接收一个 `HuffmanNode` 数组 `huffmanTree`,一个整型数组 `weight` 表示每个叶子节点的权值,以及一个整数 `n` 表示叶子节点的个数。 在构建哈夫曼树的过程中,我们首先初始化哈夫曼树的节点信息,然后将叶子节点的权值设置到节点中。接着,我们进行 `n-1` 次迭代,在每一次迭代中查找权值最小的两个节点,并将它们合并为一个新的节点。最后,我们就可以得到一个完整的哈夫曼树。 在示例代码中,我们使用了一个数组来表示哈夫曼树,节点的下标就是节点的编号。在构建哈夫曼树的过程中,我们通过设置节点的 `parent`、`leftChild` 和 `rightChild` 等属性来表示节点之间的关系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值