题目
给定一个非空二叉树的根节点 root
, 以数组的形式返回每一层节点的平均值。与实际答案相差 10^-5
以内的答案可以被接受。
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:[3.00000,14.50000,11.00000]
解释:第 0 层的平均值为 3,第 1 层的平均值为 14.5,第 2 层的平均值为 11 。
因此返回 [3, 14.5, 11] 。
示例 2:
输入:root = [3,9,20,15,7]
输出:[3.00000,14.50000,11.00000]
提示:
- 树中节点数量在
[1, 10^4]
范围内 -2^31 <= Node.val <= 2^(31 - 1)
解题方法
迭代法(BFS)
通过迭代法层序遍历二叉树,记录每层节点数及节点值之和,将层均值压入结果数组。
时间复杂度O(n)
,空间复杂度O(n)
C++代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: vector<double> averageOfLevels(TreeNode* root) { vector<double> result; queue<TreeNode*> nodes; if(root != NULL) nodes.push(root); while(nodes.size()>0) { int size = nodes.size(); double level_sum = 0; for(int i=0; i<size; i++) { level_sum += nodes.front()->val; if(nodes.front()->left != NULL) nodes.push(nodes.front()->left); if(nodes.front()->right != NULL) nodes.push(nodes.front()->right); nodes.pop(); } result.push_back(level_sum/size); } return result; } };
递归(DFS)
通过递归DFS方式遍历二叉树,记录每层和及每层元素数目。
时间复杂度O(n)
,空间复杂度O(n)
C++代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: void DFS(TreeNode* cur, int level, vector<double>& level_sum, vector<int>& level_num) { if(cur == NULL) return; if(level<level_sum.size()) { level_sum[level] += cur->val; level_num[level] += 1; } else { level_sum.push_back(cur->val); level_num.push_back(1); } DFS(cur->left, level+1, level_sum, level_num); DFS(cur->right, level+1, level_sum, level_num); } vector<double> averageOfLevels(TreeNode* root) { vector<double> result; vector<double> level_sum; vector<int> level_num; int level = 0; DFS(root, level, level_sum, level_num); int size = level_sum.size(); for(int i=0; i<size; i++) { result.push_back(level_sum[i]/level_num[i]); } return result; } };