问题 Given a non-empty binary tree, return the average value of the nodes on each level in the form of an array.
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].
问题分析:计算每一层的平均数,用一种水平投影的视角来看这个二叉树。每一层的层数为数组索引,用两个数组分别存储和值sum与结点个数count。自己写了一种方法来递归,然而变成了纵向求和,求解错误。参考了leetcode的示例代码:
/**
* 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) {
int height = getHeight(root);
long[] levelSum = new long[height];
int[] count = new int[height];
getSum(root, levelSum, count, 0);
List<Double> res = new LinkedList<>();
for (int i = 0;i < levelSum.length;i ++){
res.add(levelSum[i]*1.0/count[i]);
}
return res;
}
private int getHeight(TreeNode root){//得到树高度,来定义数组
if (root == null) return 0;
return Math.max(getHeight(root.left), getHeight(root.right)) + 1;
}
private void getSum(TreeNode r, long[] l, int[] c, int i) {
if (r == null) return;
l[i] += r.val;
c[i] ++;
getSum(r.left, l, c, i+1);//i+1保证了把一个水平上的结点值累加到对应的数组位置上
getSum(r.right, l, c, i+1);
return;
}
}