二叉树的层平均值
题目
解题思路
使用三个集合,sums集合存储每层的总和,count集合存储每层的节点数,averages存储每层的平均值。
这里要讲一下add方法和set方法的区别
add方法:用于向集合的末尾插入新的元素,是List接口中最常用的插入方法
set方法:本质上是一种替换操作, 要设置某个位置上的元素,这个位置必须已存在,否则会抛出异常
代码
java
public List<Double> averageOfLevels(TreeNode root) {
List<Integer> count = new ArrayList<>();
List<Double> sums = new ArrayList<>();
List<Double> averages = new ArrayList<>();
dfs(root,0,sums,count);
for(int i=0;i<sums.size();i++){
averages.add(sums.get(i)/count.get(i));
}
return averages;
}
private void dfs(TreeNode root, int i, List<Double> sums, List<Integer> count) {
if(root == null){
return;
}
if(i>=sums.size()){
sums.add(1.0*root.val);
count.add(1);
}else{
sums.set(i,sums.get(i)+root.val);
count.set(i,count.get(i)+1);
}
dfs(root.left,i+1,sums,count);
dfs(root.right,i+1,sums,count);
}
二叉树的层序遍历
题目
解题思路
使用先进先出队列,每次都重置队列长度,使每次队列里都是每层的节点
代码
java
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> sum = new ArrayList<>();
if(root==null)
return sum;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
List<Integer> level = new ArrayList<>();
int queueSize = queue.size();
for (int i = 0; i < queueSize; 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);
}
}
sum.add(level);
}
return sum;
}
二叉树的锯齿型层序遍历
题目
103. 二叉树的锯齿形层序遍历 - 力扣(LeetCode)
解题思路
使用depue双端队列,两端都可进。只需按照奇偶性,从不同端入队即可。
代码
java
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> sum = new ArrayList<>();
if(root==null)
return sum;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
boolean flag = false;
while (!queue.isEmpty()) {
Deque<Integer> level = new LinkedList<Integer>();
int queueSize = queue.size();
for (int i = 0; i < queueSize; i++) {
TreeNode node = queue.poll();
if(!flag){
level.offerLast(node.val);
}else{
level.offerFirst(node.val);
}
if(node.left!=null){
queue.offer(node.left);
}
if(node.right!=null){
queue.offer(node.right);
}
}
sum.add((List<Integer>) level);
flag=!flag;
}
return sum;
}
二叉树的右视图
题目
解题思路
我的思路相当暴力,只需要进行层序遍历,然后获取每层最右边的节点
代码
java
public List<Integer> rightSideView(TreeNode root) {
List<Integer> list = new ArrayList<>();
if(root==null)
return list;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
List<Integer> level = new ArrayList<>();
int queueSize = queue.size();
for (int i = 0; i < queueSize; 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);
}
}
list.add(level.get(level.size()-1));
}
return list;
}