二叉树中的权值是啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树中的权值是啥?相关的知识,希望对你有一定的参考价值。

二叉树中的权值就是对叶子结点赋予的一个有意义的数量值。

一棵深度为k,且有2^k-1个节点的二叉树,称为满二叉树。这种树的特点是每一层上的节点数都是最大节点数。而在一棵二叉树中,除最后一层外,若其余层都是满的,并且最后一层或者是满的,或者是在右边缺少连续若干节点,则此二叉树为完全二叉树。

具有n个节点的完全二叉树的深度为floor(log2n)+1。深度为k的完全二叉树,至少有2k-1个叶子节点,至多有2k-1个节点。

扩展资料:

权值计算机领域的含义:

在计算机数据结构领域,权值是树或者图中两个结点路径上的值,这个值表明一种代价,如从一个结点到达另外一个结点的路径的长度、所花费的时间、付出的费用等。

至于哈夫曼树中的权值可以理解为:权值大表明出现概率大。

一个结点的权值实际上就是这个结点子树在整个树中所占的比例.

abcd四个叶子结点的权值为7,5,2,4, 这个7,5,2,4是根据实际情况得到的,比如说从一段文本中统计出abcd四个字母出现的次数分别为7,5,2,4. 说a结点的权值为7,意思是说a结点在系统中占有7这个份量。实际上也可以化为百分比来表示,但反而麻烦,实际上是一样的。

参考资料来源:百度百科-二叉树



参考技术A 你说的是哈夫曼树吧?树的每个节点数据域data可以放一个特定的数来代表它的值,可以叫做权值。
以下来自百科:
1、路径和路径长度
  在一棵树中,从一个结点往下可以达到的孩子或子孙结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。
  2、结点的权及带权路径长度
  若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积。
  3、树的带权路径长度
  树的带权路径长度规定为所有叶子结点的带权路径长度之和,记为WPL。追问

请问,权值是自己随便赋的值吗?还有权值的特殊含义,是自己自定义的,还是权值本身就具有的呢?谢谢。

追答

是根据实际需要定义的。

本回答被提问者采纳
参考技术B 就是对叶子结点赋予的一个有意义的数量值 参考技术C 简单的来看就是叶子上的数字~

基本数据结构——二叉堆

迅速补档,为A*做一下铺垫…

概念定义

二叉堆就是一个支持插入、删除、查询最值的数据结构。他其实是一棵完全二叉树。那么堆一般分为大根堆和小根堆

大根堆

树中的任意一个节点的权值都小于或者等于其父节点的权值,则称该二叉树满足大根堆性质。

小根堆

树中的任意一个节点的权值都大于或者等于其父节点的权值,则称该二叉树满足小根堆性质。

习惯用法

一般习惯把堆用数组保存。才用父子二倍的编号方式。即:对于某一个节点x,其左儿子节点为2*x,右儿子节点为x*2+1

支持功能及代码实现

Insert插入

向二叉堆中插入一个节点。我们首先把这个节点放在堆的末尾,然后再向上层层递归更新。时间复杂度为O(log N)

int heap[Size],n;
void up(int p)
    while(p>1)
        if(heap[p]>heap[p/2])
            swap(heap[p],heap[p/2]);
            p/=2;
        
        else
            break;
        
    

void Insert(int val)
    heap[++n]=val;
    up(n);
 

注:编者在写这篇博文的时候,由于内容过于基础,所以手速大约为20迈。如若有代码错误,敬请指出与纠正。

GetTop取首

返回二叉堆堆顶的值,时间复杂度O(1)

int GetTop()
    return heap[1];

Extract去首

操作原理是将堆首取出,然后与堆尾发生交换,然后通过自减操作删除堆尾,再进行一次向下更新。时间复杂度为O(log N)

void Down(int p)
    int s=p*2;//p的左儿子
    while(s<=n)
        if(s<n&&heap[s]<heap[s+1])
            s++;//取左右两儿子中较大者的编号 
        
        if(heap[s]>heap[p])
            swap(heap[s],heap[p]);
            //这里是大根堆,所以如果子节点大于父节点,是不满足性质的。
            p=s,s=p*2; 
        
        else
            break;
        
     

void Extract()
    heap[1]=heap[n--];
    down(1);

Remove删除

这个操作实现把下标为p的节点删除。这玩意和Extract相似,把heap[p]和heap[n]交换,然后n自减。但这时候到底需要向下更新还是向上更新并不好说。所以我们两个都要。

void Remove(int k)
    heap[k]=heap[n--];
    up(k);
    Down(k);

STL助你偷懒

写了那么多废话,然而STL里有一个priority_queue(优先队列)实现了一个大根堆。支持push插入,top取首,pop去首。然而没有Remove这种定点删除的操作。考虑到A*算法用的是小根堆,这其实对A*并没什么卵用。保险起见…我去翻了一下小蓝书…发觉……

STL可以实现小根堆,是我在口胡(口头胡扯)……

技术图片

虽然STL真的只支持大根堆…但是我们可以喂他吃一个魅惑菇啊!!

技术图片

就是说,我们通过重载“<”运算符,让STL认为大就是小,小即是大!你说的黑不是黑~

那,为了防止我们正常使用"<",我们选择用结构体让他重载。

struct rec
    int id;
    double val;
;
bool operator <(const rec &a,const rec &b)
    return a.val>b.val;

题目中的Show Time

啊只要你想到处都能Show,我还有事我先走了(逃)。

 

以上是关于二叉树中的权值是啥?的主要内容,如果未能解决你的问题,请参考以下文章

离散数学里图论一章中的树的权值是啥意思?而且在求最小生成树中不知道怎么算权,超级不解中.望解答!谢谢

二叉堆

二叉树每个节点有一个权值,给定一棵二叉树,求权值和最大的值

最优二叉树求权值

基本数据结构——二叉堆

离散数学权值怎么算