zoukankan      html  css  js  c++  java
  • 哈夫曼树的带权路径长度 = 非叶子结点的权值之和 怎么理解?

    先看一个题目:

    题目描述

    哈夫曼树,第一行输入一个数n,表示叶结点的个数。需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结点有权值,即weight,题目需要输出哈夫曼树的带权路径长度。

    输入描述:
    输入有多组数据。
    每组第一行输入一个数n,接着输入n个叶节点(叶节点权值不超过100,2<=n<=1000)。
    输出描述:
    输出带权路径长度。
    示例1

    输入

    5  
    1 2 2 5 9
    

    输出

    37

    这题用到一个结论:

    哈夫曼树的带权路径长度 = 非叶子结点的权值之和

    一个便于理解这个结论的思路如下:

     1 #include <iostream>
     2 #include <string>
     3 #include <queue> 
     4 
     5 using namespace std;
     6 
     7 int a[1010];
     8 
     9 int main() 
    10 {
    11     
    12     int n;
    13     while(cin >> n)
    14     {
    15         priority_queue<int, vector<int>, greater<int> > q;
    16         for(int i = 0; i < n; ++i)
    17         {
    18             cin >> a[i];
    19             q.push(a[i]);
    20         }
    21         
    22         int ans = 0;
    23         while(q.size() > 1)
    24         {
    25             int a = q.top();
    26             q.pop();
    27             int b = q.top();
    28             q.pop();
    29             ans += a + b;
    30             q.push(a+b);
    31         }
    32 
    33         cout << ans << endl;
    34         
    35     }
    36     
    37     
    38     return 0;
    39 } 
  • 相关阅读:
    计数排序【代码】
    快速排序【代码】
    基于最大堆实现最大优先队列
    Spring入门(1)
    AJAX初步理解
    选择器
    Hibernate的映射
    Hibernate配置(2)
    查看mysql的安装路径
    Hibernate入门(1)
  • 原文地址:https://www.cnblogs.com/FengZeng666/p/12297761.html
Copyright © 2011-2022 走看看