带权路径长度

一、题目

给定n个权值作为n个叶子结点,构造哈夫曼树, 求其带权路径长度。

二、分析
带权路径长度得计算方法有两种:第一是定义法,第二是等于各个非叶子结点的权值之和。
这里我们用方法二计算,但是按照老方法,先构造一个哈夫曼树,之后再来计算会超时,所以这里我们不构造。可是对每次结果进行排序得话,再来选取最小得两个权值,函数会超时。所以我有点无能为力。然后在百度上搜索了一下,发现很多人都是使用优先队列做出来来的。所以我查阅了一下关于优先队列得知识。如下:

在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (first in, largest out)的行为特征。
优先队列的时间复杂度为O(logn),n为队列中元素的个数,其存取都需要时间。
在默认的优先队列中,优先级最高的先出队。默认的int类型的优先队列中先出队的为队列中较大的数。

定义:priority_queue<Type, Container, Functional>
Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector),Functional 就是比较的方式。
当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆。
一般是:
//升序队列,小顶堆 priority_queue <int,vector,greater > q;
//降序队列,大顶堆priority_queue <int,vector,less >q;
数据结构:优先队列,小顶堆。
优先访问小者。
三、算法实现
(主要代码)

typedef unsigned long Lu;
int main()
{
    int n,i;
    Lu sum,a,b,y,x;
    while(scanf("%d",&n)==1)
    {
        sum=0;
        priority_queue <Lu,vector<Lu>,greater<Lu> > q;//小丁堆得使用
        while(!q.empty())
            q.pop();
        for(i=1;i<=n;i++)
        {
            cin>>x;
            q.push(x);
        }
        for(i=2;i<=n;i++)
        {
            a=q.top();
            q.pop();
            b=q.top();
            q.pop();
            y=a+b;
            sum=(sum+y)%1000000007;//计算带权路径长度
            q.push(y);
        }
        printf("%lu\n",sum%1000000007);
 
    }
    return 0;
}

四、算法分析
算法分析:优先队列的时间复杂度为O(logn),n为队列中元素的个数,其存取都需要时间。计算过程为O(N)。故其时间复杂度为O(N)。
空间复杂度:O(N).

  • 3
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉树的带权路径长度(WPL)是指二叉树中所有叶结点的带权路径长度之和。\[1\]带权路径长度是从树的根结点到任意结点的路径长度(经过的边数)与该结点上权值的乘积。\[2\]要求设计一个算法来求解给定二叉树T的WPL。 一个可行的思路是使用递归来遍历二叉树的所有根结点,并将每个根结点的带权路径长度与一个静态局部变量相加,最终得到二叉树的WPL。\[3\]具体实现时,可以定义一个递归函数,该函数的参数为当前结点和该结点的深度。通过判断当前结点是否有左右子结点,来递归遍历所有的根结点。在遍历过程中,将每个根结点的带权路径长度与静态局部变量相加,最终得到二叉树的WPL。 以下是一个示例的二叉树结点数据类型的定义: typedef struct BitNode { int weight; BitNode *left, *right; } BitNode, *BitTree; 通过实现上述算法,可以计出给定二叉树的带权路径长度(WPL)。 #### 引用[.reference_title] - *1* [【数据结构】二叉树的带权路径长度WPL是二叉树中所有叶结点的带权路径长度之和。给定一颗二叉树T,采用二叉...](https://blog.csdn.net/weixin_51280571/article/details/126234359)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [二叉树的带权路径长度(WPL)是二叉树中所有叶结点的带权路径长度之和。给定一棵二叉树T,采用二叉链表存储,...](https://blog.csdn.net/weixin_48239221/article/details/120337506)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值