zoukankan      html  css  js  c++  java
  • 实用数据结构总结之哈夫曼树小结

    哈夫曼树:

    定义:  给定n个节点和它们的权值,以它们为叶子节点构造一颗带权路径和最小的二叉树,
    该二叉树即为哈夫曼树,亦称最优树。

    求哈夫曼树算法步骤:

    1.将所有节点放入集合K
    2.若集合K中剩余节点大于2个,则取出其中权值最小的两个节点,构造它们同时为某个新节点
    的左右儿子,该新节点是它们共同的双亲节点,设定它的权值为其两个儿子节点的权值和。
    并将该父亲节点放入集合K,重复步骤2或3
    3.若集合K中仅剩一个节点,该节点即为构造出的哈夫曼树的根节点,所有构造得到的中间节点
    (即哈夫曼树上非叶子节点)的权值和即为该哈夫曼树的带权路径和。


    例:
    求哈夫曼树的权值
    输入:
      多组数据,每组第一行输入一个数n,接着输入n个叶节点(叶节点权值不超过100,2<=n<=1000)
    输出:
       输出权值。
     输入:
     5
     1 2 2 5 9
     
     输出:
     37
     
    注:对于哈夫曼树的问题,我们一般采用优先队列来解决

    代码典例:
    #include <iostream>
    #include<queue>
    using namespace std;

    priority_queue<int,vector<int>,greater<int> > Q;//建立一个小顶堆

    int main()
    {
     int n;

     while(cin>>n)
     {
      while(!Q.empty()) Q.pop();//清空堆中元素
      for (int i=1;i<=n;i++)
      {
       int tmp;
       cin>>tmp;
       Q.push(tmp);//将所有权值放入堆中
      }
      int ans = 0;//保存答案

      while(Q.size()>1)
      {
       int x = Q.top();
       Q.pop();
       int y = Q.top();
       Q.pop();
       ans += x+ y;
       Q.push(x+y);
      }
            cout<<ans<<endl;
     }

        system("pause");
     return 0;
    }
     
     
     

     

  • 相关阅读:
    Java学习9
    Windows环境下实现WireShark抓取HTTPS
    WireShark新手使用教程
    charles使用教程
    charles
    知道做到
    Appium 自动化测试改造思路
    今日总结
    今日总结
    今日总结
  • 原文地址:https://www.cnblogs.com/ainima/p/6331239.html
Copyright © 2011-2022 走看看