• [LeetCode] 637. Average of Levels in Binary Tree 二叉树的层平均值


    Given a non-empty binary tree, return the average value of the nodes on each level in the form of an array.

    Example 1:

    Input:
        3
       / 
      9  20
        /  
       15   7
    Output: [3, 14.5, 11]
    Explanation:
    The average value of nodes on level 0 is 3,  on level 1 is 14.5, and on level 2 is 11. Hence return [3, 14.5, 11].

    Note:

    1. The range of node's value is in the range of 32-bit signed integer.

    给一个非空二叉树,返回每层的平均值组成的数组。

    解法:BFS迭代,层序遍历,计算每层的平均值记录到res数组,最后返回res数组。

    Java:

    public List<Double> averageOfLevels(TreeNode root) {
        List<Double> result = new ArrayList<>();
        Queue<TreeNode> q = new LinkedList<>();
        
        if(root == null) return result;
        q.add(root);
        while(!q.isEmpty()) {
            int n = q.size();
            double sum = 0.0;
            for(int i = 0; i < n; i++) {
                TreeNode node = q.poll();
                sum += node.val;
                if(node.left != null) q.offer(node.left);
                if(node.right != null) q.offer(node.right);
            }
            result.add(sum / n);
        }
        return result;
    }  

    Java: BFS

    public List<Double> averageOfLevels(TreeNode root) {
            List<Double> list = new LinkedList<>();
            Queue<TreeNode> queue = new LinkedList<>();
            queue.offer(root);
            while (!queue.isEmpty()) {
                int count = queue.size();
                double sum = 0;
                for (int i = 0; i < count; i++) {
                    TreeNode cur = queue.poll();
                    sum += cur.val;
                    if (cur.left != null) queue.offer(cur.left);
                    if (cur.right != null) queue.offer(cur.right);
                }
                list.add(sum / count);
            }
            return list;
        }
    

    Java: DFS  

    class Node {
            double sum;
            int count;
            Node (double d, int c) {
                sum = d;
                count = c;
            }
        }
        public List<Double> averageOfLevels(TreeNode root) {
            List<Node> temp = new ArrayList<>();
            helper(root, temp, 0);
            List<Double> result = new LinkedList<>();
            for (int i = 0; i < temp.size(); i++) {
                result.add(temp.get(i).sum / temp.get(i).count);
            }
            return result;
        }
        public void helper(TreeNode root, List<Node> temp, int level) {
            if (root == null) return;
            if (level == temp.size()) {
                Node node = new Node((double)root.val, 1);
                temp.add(node);
            } else {
                temp.get(level).sum += root.val;
                temp.get(level).count++;
            }
            helper(root.left, temp, level + 1);
            helper(root.right, temp, level + 1);
        }  

    Python:

    # Time:  O(n)
    # Space: O(h)
    class Solution(object):
        def averageOfLevels(self, root):
            """
            :type root: TreeNode
            :rtype: List[float]
            """
            result = []
            q = [root]
            while q:
                total, count = 0, 0
                next_q = []
                for n in q:
                    total += n.val
                    count += 1
                    if n.left:
                        next_q.append(n.left)
                    if n.right:
                        next_q.append(n.right)
                q = next_q
                result.append(float(total) / count)
            return result
    

    Python:

    class Solution(object):
        def averageOfLevels(self, root):
            """
            :type root: TreeNode
            :rtype: List[float]
            """
            if root is None:
                return []
            result, current = [], [root]
            while current:
                next_level, vals,  = [], 0.0
                counts = len(current)
                for node in current:
                    vals += node.val
                    if node.left:
                        next_level.append(node.left)
                    if node.right:
                        next_level.append(node.right)                    
                current = next_level
                result.append(vals / counts)
                
            return result   

    Python: wo  

    # Definition for a binary tree node.
    # class TreeNode(object):
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    
    class Solution(object):
        def averageOfLevels(self, root):
            """
            :type root: TreeNode
            :rtype: List[float]
            """
                    
            res = []
            self.helper([root], res)
            return res
                    
        def helper(self, q, res):
            sm = 0.0
            counts = 0
            next_level = []
            while q:
                node = q.pop()
                counts += 1
                sm += node.val
                if node.left:
                    next_level.append(node.left)
                if node.right:
                    next_level.append(node.right)
            res.append(sm / counts)
            if next_level:
                self.helper(next_level, res)
    

    C++:

    class Solution {
    public:
        vector<double> averageOfLevels(TreeNode* root) {
            if (!root) return {};
            vector<double> res;
            queue<TreeNode*> q{{root}};
            while (!q.empty()) {
                int n = q.size();
                double sum = 0;
                for (int i = 0; i < n; ++i) {
                    TreeNode *t = q.front(); q.pop();
                    sum += t->val;
                    if (t->left) q.push(t->left);
                    if (t->right) q.push(t->right);
                }
                res.push_back(sum / n);
            }
            return res;
        }
    };
    

    C++:

    class Solution {
    public:
        vector<double> averageOfLevels(TreeNode* root) {
            vector<double> res, cnt;
            helper(root, 0, cnt, res);
            for (int i = 0; i < res.size(); ++i) {
                res[i] /= cnt[i];
            }
            return res;
        }
        void helper(TreeNode* node, int level, vector<double>& cnt, vector<double>& res) {
            if (!node) return;
            if (res.size() <= level) {
                res.push_back(0);
                cnt.push_back(0);
            }
            res[level] += node->val;
            ++cnt[level];
            helper(node->left, level + 1, cnt, res);
            helper(node->right, level + 1, cnt, res);
        }
    };
    

      

    类似题目:

    [LeetCode] 102. Binary Tree Level Order Traversal 二叉树层序遍历

    [LeetCode] 107. Binary Tree Level Order Traversal II 二叉树层序遍历 II

    [LeetCode] 199. Binary Tree Right Side View 二叉树的右侧视图

      

      

    All LeetCode Questions List 题目汇总

  • 相关阅读:
    动态规划突破
    日志如何进行处理
    多线程相关问题
    Activity工作流框架
    修改模块
    spring多模块搭建Eureka服务器端
    springcould多模块搭建Eureka的服务器端口
    java操作elecsearch
    在elementui和MyBatis中前后端分离中使用shiro
    elementui的和前后端分离的微信登陆功能
  • 原文地址:https://www.cnblogs.com/lightwindy/p/9854304.html
Copyright © 2020-2023  润新知