打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
LeetCode算法题-Average of Levels in Binary Tree(Java实现)

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第145题(顺位题号是637)。给定一个非空二叉树,以数组的形式返回每一层节点值之和的平均值。例如:

    3   /   9  20     /     15  7

输出:[3,14.5,11]

说明:第一层上的节点的平均值为3,第二层上的节点的平均值为14.5,第三层上的节点的平均值为11.因此返回[3,14.5,11]。

注意:节点值的范围在32位有符号整数的范围内。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

使用广度优先算法(BFS)。使用队列来实现,在遍历节点的时候,使用了两层循环,外层控制层数,内层计算每一层的节点值之和,出了内层循环后,在外层循环里计算平均值,将平均值添加进数组中。其中有一点需要注意,计算节点值之和时,需要使用long类型,避免溢出。

/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */class Solution {    public List<Double> averageOfLevels(TreeNode root) {        List<Double> list = new ArrayList<Double>();        if (root == null) {            return list;        }        Queue<TreeNode> queue = new LinkedList<TreeNode>();        queue.offer(root);        while (!queue.isEmpty()) {            // 控制层数,其大小就是当前层数中包含的节点个数                        int size = queue.size();            int count = 0;            // 使用long类型,避免溢出                        long sum = 0;            // 处理每一层的节点值            while (size > 0) {                TreeNode temp = queue.poll();                count  ;                if (temp != null) {                    sum  = temp.val;                }                if (temp != null && temp.left != null) {                    queue.offer(temp.left);                }                if (temp != null && temp.right != null) {                    queue.offer(temp.right);                }                size--;            }            // 计算平均值,添加进数组            list.add(sum*1.0d/count);        }        return list;    }}

03 第二种解法

使用深度优先算法(DFS)。在使用深度优先算法时,需要先将每一层的节点值之和单独算出来,同时还要存储每一层的节点个数,借助递归算法实现,在得到两组数据后,再使用一次循环,计算每一层的平均值。

/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */class Solution {    public List<Double> averageOfLevels(TreeNode root) {        // 存放每一层的节点值总和        List<Double> list = new ArrayList<Double>();        if (root == null) {            return list;        }        // 存放每层节点个数        List<Integer> count = new ArrayList<Integer>();        dfs(0, root, list, count);        // 计算平均值        for (int i=0; i<list.size(); i  ) {            list.set(i, list.get(i)/count.get(i));        }        return list;    }    public void dfs(int deep, TreeNode root, List<Double> list, List<Integer> count) {        if (root == null) {            return ;        }        // 判断是否还在当前此层内        if (deep < list.size()) {            list.set(deep, list.get(deep) root.val);            count.set(deep, count.get(deep) 1);        } else {            // 新的一层            list.add(1.0*root.val);            count.add(1);        }        // 递归调用剩下的节点        dfs(deep 1, root.left, list, count);        dfs(deep 1, root.right, list, count);    }}

04 小结

此题本质上是对二叉树的BFS、DFS算法的考察,在普通遍历节点的基础上,分层处理节点数据。

算法专题目前已日更超过四个月,算法题文章145 篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。


来源:http://www.icode9.com/content-1-140151.html
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
不怕面试被问了!二叉树算法大盘点 | 原力计划
257 Binary Tree Paths 参考程序 Java/C++/Python
400,二叉树的锯齿形层次遍历
Leetcode算法「114. 二叉树展开为链表」
​LeetCode刷题实战144:二叉树的前序遍历
【小Y学算法】⚡️每日LeetCode打卡⚡️——31. 二叉树的最小深度
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服