二叉树专题刷题

二叉树的层平均值

题目

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;
    }
相关推荐
灵感__idea8 小时前
Hello 算法:众里寻她千“百度”
前端·javascript·算法
Wect18 小时前
LeetCode 130. 被围绕的区域:两种解法详解(BFS/DFS)
前端·算法·typescript
NAGNIP1 天前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
颜酱2 天前
单调栈:从模板到实战
javascript·后端·算法
CoovallyAIHub2 天前
仿生学突破:SILD模型如何让无人机在电力线迷宫中发现“隐形威胁”
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
从春晚机器人到零样本革命:YOLO26-Pose姿态估计实战指南
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
Le-DETR:省80%预训练数据,这个实时检测Transformer刷新SOTA|Georgia Tech & 北交大
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
强化学习凭什么比监督学习更聪明?RL的“聪明”并非来自算法,而是因为它学会了“挑食”
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
YOLO-IOD深度解析:打破实时增量目标检测的三重知识冲突
深度学习·算法·计算机视觉
NAGNIP2 天前
轻松搞懂全连接神经网络结构!
人工智能·算法·面试