LeetCode 二叉树的平均值(递归、层序遍历)
给定一个非空二叉树, 返回一个由每层节点平均值组成的数组.
示例 1:
输入:
3
/ \
9 20
/ \
15 7
输出: [3, 14.5, 11]
解释:
第0层的平均值是 3, 第1层是 14.5, 第2层是 11. 因此返回 [3, 14.5, 11].
注意:
节点值的范围在32位有符号整数范围内。
思路分析: 我们可以采用先序遍历,得到每一层的和以及每一层的节点个数,我们也可以使用层序遍历,得到每一层的平均值。
方法一:递归法。使用先序遍历,得到每一层的和以及每一层的节点个数,然后计算每一层的平均值。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<double> averageOfLevels(TreeNode* root) {
vector<int> deepCnt;//存储每一层的节点个数
vector<double> result;//存储每一层的和
myDFS(root, 0, result, deepCnt);//先序遍历,根节点的深度为0
//计算每一层的平均值
int resSize = result.size();
for (int index = 0; index < resSize; ++index){
result[index] /= deepCnt[index];
}
return result;
}
//先序遍历root,deepth代表的是root的深度
void myDFS(TreeNode* root, int deepth, vector<double> &result, vector<int> &deepCnt){
if (root == NULL){
return;
}
//先访问根节点
if (result.size() == deepth){
//如果这一层还没有访问过节点
deepCnt.push_back(1);
result.push_back(root->val);
}
else{
deepCnt[deepth] += 1;
result[deepth] += root->val;
}
//后访问左子树,再访问右子树
myDFS(root->left, deepth + 1, result, deepCnt);
myDFS(root->right, deepth + 1, result, deepCnt);
}
};
方法二:采用层序遍历。逐层访问二叉树,得到每层的平均值。LeetCode 二叉树的层次遍历
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<double> averageOfLevels(TreeNode* root) {
vector<double> result;
queue<TreeNode*> myQueue;//辅助队列,用于层次遍历
if (root == NULL) {
return result;
}
myQueue.push(root);
TreeNode *tempNodePtr = NULL;
while (!myQueue.empty()) {
double tempSum = 0;//此层的所有节点和
int tempQueueSize = myQueue.size();//此时队列的大小(即此层的节点数目)
for (int i = 0; i < tempQueueSize; ++i) {//将此层的所有节点出队列
tempNodePtr = myQueue.front();//获取队头
myQueue.pop();
tempSum += tempNodePtr->val;//记录val值
if (tempNodePtr->left != NULL) {//放置左子树根节点
myQueue.push(tempNodePtr->left);
}
if (tempNodePtr->right != NULL) {//放置右子树根节点
myQueue.push(tempNodePtr->right);
}
}
result.push_back(tempSum / tempQueueSize);//将此层的平均值放入结果
}
return result;
}
};