这道题,为了训练递归能力,不用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;
}
};