zoukankan      html  css  js  c++  java
  • [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 题目汇总

  • 相关阅读:
    Exchange 2013与 Office Web Apps 整合
    SharePoint2013 以其他用户登录和修改AD域用户密码 功能
    sharepoint 2010 自定义页面布局
    sharepoint 2010 记录管理 对象模型
    SharePoint2010 对象模型 关联列表
    在SharePoint Server 2010中更改“我的网站”
    xenapp 6.5 客户端插件第一次安装总是跳到官网
    如何解决在Windows Server 2008 R2 上安装证书服务重启后出现 CertificationAuthority 91错误事件
    在Win7 Hyper-v虚拟机中挂接真实机的声卡
    win8 中如何删除 共享文件夹 用户名和密码
  • 原文地址:https://www.cnblogs.com/lightwindy/p/9854304.html
Copyright © 2011-2022 走看看