精华内容
下载资源
问答
  • 在一批数中, 选择两个最小的数字,用一个类似于树杈的“树枝”连接上两个最小的数。在顶点处计算出这两个数字的和 并写在上面。然后再比较剩下的数字和这个和的大小,再取出两个最小的数字进行排列
  • 带权路径长度

    千次阅读 2020-12-15 11:36:37
    给定n个权值作为n个叶子结点,构造哈夫曼树, 求其带权路径长度。 二、分析 带权路径长度得计算方法有两种:第一是第一法,第二是等于各个非叶子结点的权值之和。 这里我们用方法二计算,但是按照老方法,先构造一个...

    一、题目

    给定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).

    展开全文
  • 层次:从树根开始定义,树根为第一层 深度:从根开始,向下累加 高度:从叶开始,向上累加 这里定义:树的高度/深度为数中结点最大层次数。...树的带权路径长度(WPL):所有叶结点带权路径长度之和.

    层次:从树根开始定义,树根为第一层

    深度:从根开始,向下累加
    高度:从叶开始,向上累加
    这里定义:树的高度/深度为数中结点最大层次数。

    A到B的路径长度:A到B所经过的边数(B层数 - A层数)
    树的路径长度:从根到树中每一结点的路径长度之和。
    在结点数目相同的二叉树中,完全二叉树的路径长度最短。

    带权路径长度到该结点的路径长度 × \times ×该结点的权值
    \qquad\qquad\qquad (A层数 - 1) × \times × A权值
    树的带权路径长度(WPL):所有叶结点带权路径长度之和
    WPL最小的数——Huffman树

    展开全文
  • 二叉树的带权路径长度: 每个叶结点的深度与权值之积德总和。 方法:先序遍历或层次遍历 结点类型定义: typedef struct BiTNode{ int weight; struct BiTNode *lchild,*rchild; }BiTNode,BiTree; 基于先序: ...

    二叉树的带权路径长度: 每个叶结点的深度与权值之积德总和。

    方法:先序遍历或层次遍历

    结点类型定义:

    typedef struct BiTNode{
        int weight;
        struct BiTNode *lchild,*rchild;
    }BiTNode,BiTree;

    基于先序

    使用static 变量 wpl记录权值,每个结点的深度作为递归函数的参数传递。具体算法如下

    1)若是叶结点,wpl=wpl+该结点的深度与权值之积;

    2)非叶结点,若左子树不空,对左子树调用递归算法;

          若右子树不空,对其调用递归算法,深度参数为本结点的深度参数加1;

    3)最后返回wpl。

    int WPL(BiTree root){
        return wpl_PreOrder(root,0);
    }
    
    int wpl_PreOrder(BiTree root,int deep){
        static wpl = 0;
        if(root->llchild == NULL && root->rchild==NULL)
            wpl+=deep*root->weight;
    
        if(root->lchild!=NULL)
            wpl_PreOrder(root->lchild,deep+1);
        if(root->rchild!=NULL)
            wpl_PreOrder(root->rchild,deep+1);
    }

    基于层次遍历

    使用队列进行层次遍历,记录当前的层数;

    1)遍历到叶结点时,累计wpl;

    2)非叶结点时,将其子树加入队列;

    3)该结点为该层最后一个结点时,层数自增1;

    4)队列空遍历结束,返回wpl;

    #define Maxsize 100 //队列最大容量
    
    int wpl_levelOrder(BiTree root){
        BiTree q[Maxsize];
        int end1,end2;
        end1=end2=0;
        int wpl=0,deep=0;
        BiTree lastNode;      //当前层最后一个结点
        BiTree newLastNode;   //下一层最后一个结点
        lastNode = root;
        newLastNode = NULL;
        q[end2++]=root;
        
        while(end1!=end2){
            BiTree t=q[end1++];
            if(t->lchild==NULL&&t->rchild==NULL)//叶结点统计wpl
                wpl+=deep*t->weight;
            if(t->lchild != NULL){
                q[end2++]=t->lchild;//非叶结点入队
                newLastNode=t->lchild;
            }
            if(t->rchild != NULL){
                q[end2++]=t->rchild;
                newLastNode=t->rchild;
            }
            if(t==lastNode){
                lastNode=newLastNode;
                deep+=1;
            }
        }
        return wpl;
    }

    展开全文
  • 计算方法: ①先对集合中的结点按照权值从小到大排。 ②选两个权值最小的结点,将它们...⑤计算的时候,只计算那些初始权值里面有的值,把它们的【权值】*【权值到根节点的距离】,再全部相加得到带权路径长度。 ...

    计算方法:

    ①先对集合中的结点按照权值从小到大排。

    ②选两个权值最小的结点,将它们的权值相加构成一个新结点,原来的这两个最小的结点是新结点的左右子结点。

    ③在有序集合中将两个被加过的结点去掉,再把新的结点放入集合中排序,然后重复过程②。

    ④直到完全生成一棵树。

    ⑤计算的时候,只计算那些初始权值里面有的值,把它们的【权值】*【权值到根节点的距离】,再全部相加得到带权路径长度。

    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结点有权值,即weight,题目需要输出哈夫曼树的带权路径长度(WPL)。 输入格式: 第一行输入一个数n,第二行输入n个叶结点(叶结点权值不超过1000,2<=n&...
  • 哈夫曼树带权路径长度

    万次阅读 多人点赞 2018-08-13 16:24:51
    可见,b的带权路径长度较小,我们可以证明b就是哈夫曼树(也称为最优二叉树)。   二. 怎么生成和计算? 1. 总结 ①先对权值从小到大排序。 ②选两个最小的加起来成为一个新结点,而这两个最小的值是新结点...
  • 求二叉树的带权路径长度问题

    千次阅读 2019-07-02 00:39:36
    求二叉树的带权路径长度问题问题中的名词解释1 二叉树定义2 二叉树的带权路径长度问题解决方法1 先序遍历2 层次遍历个人总结 问题中的名词解释 1 二叉树定义 二叉树是n(n>=0)个节点的有限集合: 1 或者为空...
  • 树的带权路径长度

    千次阅读 2019-07-24 16:37:36
    从根节点到各个叶子结点的路径长度与相应叶子结点权值的乘积之和叫做二叉树的带权路径长度
  • 哈夫曼树与带权路径长度

    千次阅读 2020-02-18 15:28:38
    哈夫曼树与带权路径长度 哈夫曼树是带权路径最小的一种特殊二叉树,所以也称最优二叉树。 在这里不讨论基本概念如如何计算路径等,而只着重于树的创建,具体过程让我们举例而言。 其基本的原理为:将所有节点一开始...
  •  二叉树的带权路径长度WPL是二叉树中所有叶结点的带权路径长度之和。给定一棵二叉树,采用二叉链表存储,叶子结点的weight域为该结点的权值。请设计一个算法,求二叉树的带权路径长度。 算法思想 可以使用先序遍历...
  • 根据哈弗曼树构造方法,我们不妨以 {1,2,2,5,9} 节点权值举例,根据上述方法我们可以构造出其哈夫曼树为如下: 由我们可以很容易得到带权路径长度= 37=9∗1+5∗2+2∗3+2∗4+1∗4(常规) 37=9*1+5*2+2*3+2*4+...
  • 3766. 二叉树的带权路径长度 原题传送:AcWing 3766. 二叉树的带权路径长度 二叉树的带权路径长度(WPL)是二叉树中所有叶结点的带权路径长度之和,也就是每个叶结点的深度与权值之积的总和。 给定一棵二叉树 TTT ,请...
  • 二叉树存储结构: typedef struct Tnode { char data; struct Tnode *lnode; struct Tnode *rnode; }Tnode; typedef Tnode* type;...求二叉树带权路径长度——递归与非递归实现C语言实现代码下载
  • 给定n个权值(权值均是大于0的正整数),构造赫夫曼树HT,并求出赫夫曼树HT的带权路径长度。 注意:构造赫夫曼树HT时,在将2棵二叉树合并成一棵新的二叉树时,将根结点权值小的用作左子树! 输入 先输入权值的个数n(n...
  • 思想: 先构建一个线性表,将树的结点存入,然后对树的结点进行升序排序,这样就保证了线性表的前两...而寻找带权路径长度可以使用递归的方法。 代码: public class Main { public static void main(String[] args) {
  • 注意:哈夫曼树并不唯一,但带权路径长度一定是相同的。 二叉树:每个结点最多含有两个子树的树称为二叉树。 定理:对于具有n个叶子结点的哈夫曼树,共有2n-1个结点。 哈夫曼树介绍 1哈夫曼树的定义 哈夫曼...
  • 求二叉树带权路径长度(WPL) 简介:*树的带权路径长度(Weighted Path Length of Tree,简记为WPL)*二叉树的带权路径长度是每个叶子节点深度(高度)与其指定权重的乘积总和。 算法思想:对于求带权路径长度我们...
  • 带权路径长度(c++优先队列)

    千次阅读 2018-09-08 14:02:12
    思路:本题是求带权路径长度,可以用常规的构造哈夫曼树求带权路径长度;此外带权路径长度还是哈夫曼树所有非叶子节点的和;本题我采用的是通过求所有非叶子节点的和来就带权路径长度; 第一次的代码如下: #...
  • 设计算法求二叉树的带权路径长度(WPL) 二叉树的带权路径长度(WPL)是二叉树中所有叶结点的带权路径长度之和。 队列的基本操作以严蔚敏编写的教材为准。 基于层次遍历的算法: int WPL_LevelOrder (BiTree T) { ...
  • 带权路径长度:结点具有权值,从该结点到根之间的路径长度乘以结点的权值,就是该结点的带权路径长度。 叶子结点的带权路径长度:从叶结点到根之间的路径长度(所在层数-1)乘以叶结点的权值。 树的带权路径...
  • 二叉树计算带权路径长度(WPL)的算法 更多内容请访问点击我的主页 题目 : 二叉树的带权路径长度是二叉树中所有叶子结点的带权路径长度之和。给定二叉链表的存储的结点结构为 left weight right weight...
  • 哈夫曼树 和 树的带权路径长度

    万次阅读 2018-08-28 04:37:41
    树的带权路径长度(Weighted Path Length of Tree):定义为树中所有叶结点的带权路径长度之和。 结点的带权路径长度:结点到树根之间的路径长度与该结点上权的乘积。 哈夫曼树是一种带权路径长度最短的二叉树,也...
  • 哈夫曼树与带权路径长度计算

    万次阅读 2018-09-18 10:35:48
    假设我们一个权重为1,7,3,13,12,15,24怎么样画出哈夫曼树和计算带权路径长度。 首先,选出最小的两个权重值,这里是1,3(矩形表示叶子节点,圆表示根节点也是两个叶子节点的和)如: 然后,选出第三小的7,算...
  • 层次遍历(广搜),如果没有规定节点结构可以再节点里设置一个深度标记,更简单。 typedef struct{ struct BiTNode *lchild,*rchild; int weight; }BiTNode,*BiTree; int wpl(BiTree T){ ... BiTre..
  • void WPL() 计算带权路径长度 所选实例: 所选实例 创建哈夫曼树 步骤: 假设有n个权值,则构造出的哈夫曼树有n个叶子结点。 n个权值分别设为 w1、w2、…、wn,则哈夫曼树的构造规则为: (1) 将w1、w2、...
  • 笔试题:哈夫曼编码{4,9,2,7,5,12}的带权路径长度 解决思路: 首先构造哈夫曼树 在使用WPL=(W1*L1+W2*L2+W3*L3+…+Wn*Ln)计算带权路径长度 实现: 构造哈夫曼树: 每次取出最小的两个数构造第一层,在给出的...
  • 已知输入一串正整数,正整数之间用空格键分开,请建立一个哈夫曼树,以输入的数字为叶节点,求这棵哈夫曼树的带权路径长度。 【输入形式】 首先输入正整数的个数,然后接下来为接下来的正整数,正整数个数不超过10个...
  • 树上最大带权路径长度

    千次阅读 2018-12-19 21:29:31
    分析:拿第一个样例来说,先维护f,s两个数组,f[x]表示以x为根的子树的所有结点到x的带权路径长度和,s[x]表示以x为根的子树所有结点包括x结点的权值和。假设y是x结点的儿子,那么把以y为根的子树当作一个整体,该...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,674
精华内容 5,869
关键字:

带权图的路径长度