【算法笔记】- 哈夫曼树

哈夫曼树


很多题目不需要真的构造一个哈夫曼树,只需要能得到最终的带权路径长度即可;
因此先掌握哈夫曼树的构建思想,即反复选择最小的两个元素进行合并,直到只剩下一个元素即可

  • 实现

可使用优先队列(堆结构)进行来执行这种策略

  • 样例
//哈夫曼树 思想 - 优先队列实现 最佳合并
priority_queue<int, vector<int>, greater<int> > q;

int main() {

    int n, temp, x, y, ans = 0;
    scanf("%d", &n);
    for(int i = 0; i < n; i++) { //数据输入优先级队列中
        scanf("%d", &temp);
        q.push(temp);
    }

    while(q.size() > 1) { //队列中元素多余1个
        //取出堆顶的两个元素
        x = q.top();
        q.pop();
        y = q.top();
        q.pop();
        q.push(x + y);
        ans += x + y;
    }

    printf("%d\n", ans);

    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_26398495/article/details/81708365