二叉树专题刷题

二叉树的层平均值

题目

637. 二叉树的层平均值 - 力扣(LeetCode)

解题思路

使用三个集合,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);
    }

二叉树的层序遍历

题目

102. 二叉树的层序遍历 - 力扣(LeetCode)

解题思路

使用先进先出队列,每次都重置队列长度,使每次队列里都是每层的节点

代码

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;
    }

二叉树的右视图

题目

199. 二叉树的右视图 - 力扣(LeetCode)

解题思路

我的思路相当暴力,只需要进行层序遍历,然后获取每层最右边的节点

代码

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;
    }
相关推荐
雾月5540 分钟前
LeetCode 1292 元素和小于等于阈值的正方形的最大边长
java·数据结构·算法·leetcode·职场和发展
知来者逆2 小时前
计算机视觉——速度与精度的完美结合的实时目标检测算法RF-DETR详解
图像处理·人工智能·深度学习·算法·目标检测·计算机视觉·rf-detr
阿让啊2 小时前
C语言中操作字节的某一位
c语言·开发语言·数据结构·单片机·算法
এ᭄画画的北北2 小时前
力扣-160.相交链表
算法·leetcode·链表
爱研究的小陈3 小时前
Day 3:数学基础回顾——线性代数与概率论在AI中的核心作用
算法
渭雨轻尘_学习计算机ing3 小时前
二叉树的最大宽度计算
算法·面试
BB_CC_DD4 小时前
四. 以Annoy算法建树的方式聚类清洗图像数据集,一次建树,无限次聚类搜索,提升聚类搜索效率。(附完整代码)
深度学习·算法·聚类
梁下轻语的秋缘5 小时前
每日c/c++题 备战蓝桥杯 ([洛谷 P1226] 快速幂求模题解)
c++·算法·蓝桥杯
CODE_RabbitV5 小时前
【深度强化学习 DRL 快速实践】逆向强化学习算法 (IRL)
算法
mit6.8246 小时前
[贪心_7] 最优除法 | 跳跃游戏 II | 加油站
数据结构·算法·leetcode