1.题目
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:
- The range of node's value is in the range of 32-bit signed integer.
2.思路
广度优先,层序遍历的方式。难点就是在,如何判断每一层结束了。两种方法可以判断一层遍历完,一种方式是在结尾加个特殊标记null结点,一种是数清楚每一层节点的个数。这道题中,我采用计数的方式。(因为加标记的方法没过~~)
3.算法
class Solution {
public List<Double> averageOfLevels(TreeNode root) {
//层序遍历
// 此方法没通过,因为我是在queue中加入左孩子、右孩子之后都加了null,这样肯定是不对的。
// ArrayList<Double> res=new ArrayList();
// Queue<TreeNode> mQueue=new LinkedList();
// int count=0;
// int per=0;
// double average=0;
// mQueue.add(root);
// mQueue.add(null);
// while(!mQueue.isEmpty()){
// TreeNode now=mQueue.poll();
// if(now!=null){
// count+=now.val;
// per++;
// if(now.left!=null)mQueue.add(now.left);
// if(now.right!=null)mQueue.add(now.right);
// mQueue.add(null);
// }else{
// if(per!=0){
// average=(double)count/per;
// res.add(average);
// count=0;
// per=0;
// }
// }
// }
// return res;
ArrayList<Double> res=new ArrayList();
Queue<TreeNode> mQueue=new LinkedList();
long count=0;
int per=0;
double average=0;
int size=0;
TreeNode now;
mQueue.add(root);//一定要首先把根结点加进来
while(!mQueue.isEmpty()){
size=mQueue.size();//这句是关键,判断此次,要处理几个节点
for(int i=0;i<size;i++){
now=mQueue.poll();
count+=now.val;
if(now.left!=null)mQueue.add(now.left);
if(now.right!=null)mQueue.add(now.right);
}
average=(double)count/size;
res.add(average);
count=0;
}
return res;
}
}
4.总结
循环的结束条件,非常重要。要找对判断循环结束的条件。