这道题就是一个比较简单的层序遍历,只需要利用队列存放二叉树结点,队列的size代表每层的节点数也就是平均值的除数,利用一个结果数组记录每层平均值,最后返回。
需要注意的是,平均值定义成double类型。
代码如下:
java
class Solution {
public List<Double> averageOfLevels(TreeNode root) {
// 结果数组
List<Double> results = new ArrayList<>();
if (root == null) {
return results;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
// 当前层节点数量
int LevelSize = queue.size();
// 当前节点值的总和
double levelSum = 0;
// 遍历当前层所有节点
for (int i = 0; i < LevelSize; i++) {
// 从队列中取出一个节点
TreeNode node = queue.poll();
levelSum += node.val;
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
}
double average = levelSum / LevelSize;
results.add(average);
}
return results;
}
}

这道题其实就是简单的二叉树层序遍历,只不过把每层的节点遍历单独拿了出来,那么其实很简单。创建一个嵌套列表List<List<Integer>> res = new ArrayList<List<Integer>>(),每层的结果用一维列表存储,最后把每层结果存进嵌套列表输出即可。
代码如下:
java
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res=new ArrayList<List<Integer>>();
if(root==null){
return res;
}
Queue<TreeNode>queue=new LinkedList<TreeNode>();
queue.offer(root);
while(!queue.isEmpty()){
List<Integer>level=new ArrayList<Integer>();
int currentSize=queue.size();
for(int i=1;i<=currentSize;++i){
TreeNode node=queue.poll();
level.add(node.val);
if(node.left!=null){
queue.offer(node.left);
}
if(node.right!=null){
queue.offer(node.right);
}
}
res.add(level);
}
return res;
}
}

这道题就用到了一种平常不怎么常用的数据结构,双端队列,利用一个bool 变量来表示该层是从左往后还是从右往左
-
如果从左至右,我们每次将被遍历到的元素插入至双端队列的末尾。
-
如果从右至左,我们每次将被遍历到的元素插入至双端队列的头部。
代码如下:
java
class Solution {
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>>ans=new LinkedList<List<Integer>>();
if(root==null){
return ans;
}
Queue<TreeNode>nodequeue=new ArrayDeque<TreeNode>();//双端队列
nodequeue.offer(root);
boolean isOrderLeft=true;
while(!nodequeue.isEmpty()){
Deque<Integer> levelList=new LinkedList<Integer>();
int size=nodequeue.size();
for(int i=0;i<size;i++){
TreeNode curNode=nodequeue.poll();
if(isOrderLeft){
levelList.offerLast(curNode.val);
}
else{
levelList.offerFirst(curNode.val);
}
if(curNode.left!=null){
nodequeue.offer(curNode.left);
}
if(curNode.right!=null){
nodequeue.offer(curNode.right);
}
}
ans.add(new LinkedList<Integer>(levelList));
isOrderLeft=!isOrderLeft;
}
return ans;
}
}