637. 二叉树的层平均值

这道题,为了训练递归能力,不用BFS做,但是发现csdn或者leetcode的discuss里很多都是用bfs做的,表示现在一看到队列就觉得low。。。。。。偶尔发现有递归版本,但是不是用带深度这一参数的方式实现的,所以我感觉不够纯粹。到这里,还是b站清华大佬六批,思路够纯粹,且适合初学者。

这种技巧的核心是怎么能记录下来每一层的值的和是多少,其实可以联想“数组”可以通过对应下标处理对应的值,于是我们可以定义一个元素为pair<int,int>的vector,其中pair的第一个元素用作存储每一层的值的和,pair的第二个元素用来存储该层元素的个数。通过vector的 下标这个索引,可以将对应层的元素加入到对应层的和里,以及统计每一层的元素个数。

这个题我有一个地方我不知道,就是为什么要填充make_pair(0,0)????不填充就会报类似数组越界的错误。

此外,还有几个地方需要注意,即最后first/second的时候,first要乘以1.0,这样才能是double。还有,当出现一下问题的时候,可能是我们给的数值范围太小,超出了某个较小的范围。比如,这里的first如果定义成int,那么最后的加和就可能超过Int的范围,所以要定义成long long。

class Solution {
public:
    // vector<double> ret;
    vector<pair<int,int >> v;
    
    void dfs(TreeNode* root,int k)
    {
        if(root==NULL) return;
        
        if(k>v.size())
        {
            v.push_back(make_pair(0,0));
        }
        v[k-1].first=v[k-1].first+root->val;
        v[k-1].second=v[k-1].second+1;//统计次数
        dfs(root->left,k+1);
        dfs(root->right,k+1);    
    }
    
    vector<double> averageOfLevels(TreeNode* root) {
        dfs(root,1);
        vector<double> ret;
        for(auto i:v)
        {
            ret.push_back((i.first)*1.0/(i.second));
        }
        return ret;
    }
};

<think>好的,用户问的是“二叉树加权平均长度”,我需要先准确理解这个概念。首先,二叉树的相关术语中,加权平均长度可能指的是路径长度相关的平均值,比如带权路径长度。不过用户提到的是“加权平均长度”,可能是指每个节点带有权重,然后计算平均路径长度? 接下来,我需要确认正确的术语。在数据结构中,常见的概念有“树的路径长度”和“带权路径长度”。比如,哈夫曼树中的带权路径长度(WPL)就是各个叶子节点的权值乘以其到根节点的路径长度之和。所以,可能用户想问的是这个? 或者,可能用户指的是二叉树中所有节点的路径长度的加权平均,这里的权重可能是节点的某些属性,比如出现的频率、权值等。如果是这样,那么计算方法应该是将每个节点的路径长度乘以其权重,然后和,最后除以总权重或者节点数量,得到平均值。 需要进一步明确:加权平均长度中的“权重”是指节点的权值,还是其他因素?比如在哈夫曼编码中,带权路径长度确实是权值乘以路径长度之和,但那是总和,不是平均。用户问的是平均,所以可能需要将总和除以总权值或者节点数目。 接下来,我需要分步骤解释这个概念。首先,可能需要介绍二叉树的基本结构,然后解释路径长度的定义,即从根节点到某节点的边数。接着,引入权重,每个节点有一个权重值,然后计算每个节点的路径长度乘以权重,和后再除以总权重,得到加权平均长度。 举个例子会有帮助。比如,一个二叉树有三个叶子节点,权值分别为2、3、5,它们的路径长度分别为2、1、2。那么带权路径长度总和是2*2 +3*1 +5*2=4+3+10=17。如果计算加权平均长度,可能是17/(2+3+5)=17/10=1.7。 但需要确认这个例子是否符合用户的意图。另外,需要区分带权路径长度和加权平均路径长度,前者是总和,后者是平均值。 还要注意,用户可能混淆了不同的术语,需要明确说明。比如,在数据结构中,带权路径长度通常用于哈夫曼树,而加权平均长度可能是一个更一般的概念,或者用户自己定义的指标。 因此,回答的结构应该是:定义、公式、例子、应用场景。确保步骤清晰,使用中文,并且正确使用LaTeX格式。 需要检查是否有其他可能的解释,比如是否涉及树的级权重或其他因素,但根据常见知识,带权路径长度是更可能相关的概念。因此,重点放在这个部分,同时解释如何从总和转换到平均值。 最后,确保LaTeX公式的正确性,行内公式用$...$,独立公式用$$...$$,并正确换行。例如,带权路径长度公式为$\text{WPL} = \sum_{i=1}^{n} w_i \times l_i$,而加权平均长度则为$\frac{\sum w_i l_i}{\sum w_i}$。</think>二叉树加权平均长度通常与**带权路径长度(Weighted Path Length, WPL)**相关,是衡量二叉树中节点访问效率的重要指标。以下是逐步说明: --- ### 1. **基本定义** - **路径长度**:从根节点到某节点的**边数**(即数减1)。 - **权重**:每个节点可能关联一个权重值(如频率、概率等),记为$w_i$。 - **加权路径长度**:节点路径长度$l_i$与权重$w_i$的乘积,即$w_i \times l_i$。 --- ### 2. **加权平均长度公式** 加权平均长度是**所有节点加权路径长度的总和**除以**总权重**: $$ \text{加权平均长度} = \frac{\sum_{i=1}^{n} w_i \times l_i}{\sum_{i=1}^{n} w_i} $$ --- ### 3. **计算示例** 假设二叉树有3个叶子节点: - 节点A:权重$w_1=2$,路径长度$l_1=2$ - 节点B:权重$w_2=3$,路径长度$l_2=1$ - 节点C:权重$w_3=5$,路径长度$l_3=2$ 计算过程: 1. 加权路径总和:$2 \times 2 + 3 \times 1 + 5 \times 2 = 4 + 3 + 10 = 17$ 2. 总权重:$2 + 3 + 5 = 10$ 3. 加权平均长度:$\frac{17}{10} = 1.7$ --- ### 4. **应用场景** - **哈夫曼编码**:通过最小化带权路径长度(WPL)生成最优前缀码。 - **搜索树优化**:权重可表示查询频率,加权平均长度越小,搜索效率越高。 --- ### 5. **与普通平均长度的区别** - **普通平均长度**:直接对所有路径长度取算术平均(忽略权重)。 - **加权平均长度**:考虑了节点权重的影响,更贴近实际应用需。 --- **总结**:二叉树加权平均长度通过权重反映节点重要性,是衡量树结构效率的核心指标,尤其在哈夫曼树等场景中至关重要。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值