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 二叉树的平均值(递归、层序遍历)
方法二:采用层序遍历。逐层访问二叉树,得到每层的平均值。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;
    }
};

LeetCode 二叉树的平均值(递归、层序遍历)