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;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值