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;
    }
     
     
     

     

  • 相关阅读:
    页面整体布局思路
    CSS3转换、过渡、动画效果及css盒子模型
    CSS随笔
    CSS基础,认识css样式
    HTML基础表单
    HTML基础
    java.sql.SQLException: 调用中无效的参数DSRA0010E: SQL 状态 = null,错误代码 = 17,433
    There is no Action mapped for namespace / and action name accredit.
    myeclipse开启后卡死、building workspace缓慢 问题解决
    you need to upgrade the working copy first
  • 原文地址:https://www.cnblogs.com/ainima/p/6331239.html
Copyright © 2011-2022 走看看