题1:一棵树每层节点的平均数(Average of Levels in Binary Tree)
LeetCode题号:637
难度:Easy
链接:https://leetcode-cn.com/problems/average-of-levels-in-binary-tree/
题目描述:
给定一个非空二叉树, 返回一个由每层节点平均值组成的数组。
代码:
1 /** 2 * Definition for a binary tree node. 3 * public class TreeNode { 4 * int val; 5 * TreeNode left; 6 * TreeNode right; 7 * TreeNode(int x) { val = x; } 8 * } 9 */ 10 class Solution { 11 public List<Double> averageOfLevels(TreeNode root) { 12 List <Double> ret = new ArrayList<>(); 13 if(root==null) return ret; 14 Queue <TreeNode> queue = new LinkedList<>(); 15 queue.add(root); 16 while (!queue.isEmpty()) { 17 //当前队列中的元素个数 18 int cnt = queue.size(); 19 //当前队列元素之和 20 double sum = 0; 21 //遍历当前层的所有节点 22 for (int i = 0; i < cnt; i++) { 23 TreeNode node = queue.poll(); 24 sum += node.val; 25 //把当前节点的孩子节点加入队列 26 if (node.left != null) queue.add(node.left); 27 if (node.right != null) queue.add(node.right); 28 } 29 ret.add(sum / cnt); 30 } 31 return ret; 32 } 33 }
分析:
使用 BFS 进行层次遍历。通过一个队列来存放一层的元素。i用于指向当前层的所有节点。每遍历到当前层的节点,就把这个节点弹出,并把值加到sum中,然后把它的所有孩子节点加到队列里。每一组for循环计算一层数据。然后重新计算队列长度(下一层的节点个数),再进入下一组for循环。