• 哈夫曼树(附C++代码)


           背景

            在某次测试中,MCYH遇到了这样一道题。

            

    以{1,3,5,7,9,11,13,15}为叶子节点构造一棵哈夫曼树,求最小带权路长度

            然后他采用了瞎猜大法,完美避开正确答案。

            第二天MCYH认真学习了哈夫曼树的知识。

         本题做法

            第一步,构造出哈夫曼树。

     ↑拙劣的构图

            第二步,计算路径长度。

            路径长度就是除了叶节点以外所有节点权值之和。

            比如上面这棵树,叶节点为1,3,5,7,9,11,13,15,因此路径长度为4+9+16+20+28+36+64=177  答案就出来啦!

    C++代码实现

            核心思想:用小根堆存储节点,每次取出两个最小的(即顶端的两个),然后将它们合并,累加合并后的节点权值。

    1. #include
    2. #include
    3. using namespace std;
    4. int main()
    5. {
    6. priority_queue<int,vector<int>,greater<int> >q;//小根堆
    7. int n,x;
    8. scanf("%d",&n);
    9. for(i=1;i<=n;i++)
    10. {
    11. scanf("%d",&x);
    12. q.push(x);//存储叶子节点的权值
    13. }
    14. int ans=0;
    15. while(q.size()>1)
    16. {
    17. int s1=q.top(),q.pop();//第一小的节点权值
    18. int s2=q.top(),q.pop();//第二小的节点权值
    19. ans+=(s1+s2);//累加
    20. q.push(s1+s2);//合并后的新节点再次塞入节点队列
    21. }
    22. printf("%d",ans);
    23. return 0;
    24. }

  • 相关阅读:
    Java Web之Maven
    SpringBoot底层注解总结
    Qt之使用QTreeView实现QQ登录好友列表
    Java8新特性——Lambda表达式
    实现地图遮罩 leaflet
    医院管理系统详细设计说明书
    记一次 .NET 某智慧物流 WCS系统 CPU 爆高分析
    荧光染料Cy7 酰肼,Cy7 hydrazide,Cy7 HZ参数及结构式解析
    [MySQL]单行函数
    sql优化常用技巧及理解
  • 原文地址:https://blog.csdn.net/MCYH0206/article/details/126343726