20230503 - 二叉树2 | 二叉树的层序遍历、226. 翻转二叉树、101. 对称二叉树

news2024/11/16 14:21:57

1、二叉树的层序遍历

二叉树的层序遍历,就是图论中的广度优先搜索在二叉树中的应用,需要借助队列来实现(此时又发现队列的一个应用了)。

来吧,一口气打十个:

102.二叉树的层序遍历

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        if(root == null) return res;
        //队列存储,进行层序遍历
        Queue<TreeNode> q = new ArrayDeque<>();
        //第一个入队
        q.add(root);
        while(!q.isEmpty()){
            //记录每一行的
            ArrayList<Integer> row = new ArrayList<>();
            int n = q.size();
            //因为先进入的是根节点,故每层节点多少,队列大小就是i多少
            for(int i=0;i<n;i++){
                //接收临时
                TreeNode cur = q.poll();
                row.add(cur.val);
                //若是左右孩子存在,则存入左右孩子作为下一次层次
                if(cur.left!=null) q.add(cur.left);
                if(cur.right !=null) q.add(cur.right);
            } 
            //每一层加入输出
            res.add(row);
        }
        return res;
    }
}

107.二叉树的层次遍历II

class Solution {
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        if(root == null) return res;
        //队列存储,进行层序遍历
        Queue<TreeNode> q = new ArrayDeque<>();
        //第一个入队
        q.add(root);
        while(!q.isEmpty()){
            //记录每一行的
            ArrayList<Integer> row = new ArrayList<>();
            int n = q.size();
            //因为先进入的是根节点,故每层节点多少,队列大小就是i多少
            for(int i=0;i<n;i++){
                //接收临时
                TreeNode cur = q.poll();
                row.add(cur.val);
                //若是左右孩子存在,则存入左右孩子作为下一次层次
                if(cur.left!=null) q.add(cur.left);
                if(cur.right !=null) q.add(cur.right);
            } 
            //每一层加入输出
            res.add(row);
        }
        List<List<Integer>> res1 = new ArrayList<>();
        for(int i=res.size()-1;i>=0;i--){
            res1.add(res.get(i));
        }
        return res1;
    }
}

199.二叉树的右视图

class Solution {
    public List<Integer> rightSideView(TreeNode root) {
        // List<List<Integer>> res = new ArrayList<>();
          List<Integer> list = new ArrayList<>();
        if(root == null) return list;
        //队列存储,进行层序遍历
        Queue<TreeNode> q = new ArrayDeque<>();
        //第一个入队
        q.add(root);
        while(!q.isEmpty()){
            //记录每一行的
            ArrayList<Integer> row = new ArrayList<>();
            int n = q.size();
            //因为先进入的是根节点,故每层节点多少,队列大小就是i多少
            for(int i=0;i<n;i++){
                //接收临时
                TreeNode cur = q.poll();
                row.add(cur.val);
                //若是左右孩子存在,则存入左右孩子作为下一次层次
                if(cur.left!=null) q.add(cur.left);
                if(cur.right !=null) q.add(cur.right);
            } 
            //每一层加入输出
            list.add(row.get(row.size()-1));
        }

       
        return list;
    }
}

637.二叉树的层平均值

class Solution {
    public List<Double> averageOfLevels(TreeNode root) {
        List<Double> list = new ArrayList<>();
        if(root == null) return list;
        //队列存储,进行层序遍历
        Queue<TreeNode> q = new ArrayDeque<>();
        //第一个入队
        q.add(root);
        
        while(!q.isEmpty()){
            //记录每一行的
             double levelSum = 0.0;
            int n = q.size();
            //因为先进入的是根节点,故每层节点多少,队列大小就是i多少
            for(int i=0;i<n;i++){
                //接收临时
                TreeNode cur = q.poll();
                levelSum += cur.val;
                //若是左右孩子存在,则存入左右孩子作为下一次层次
                if(cur.left!=null) q.add(cur.left);
                if(cur.right !=null) q.add(cur.right);
            } 
            //每一层加入输出
            list.add(levelSum / n);
        }

        return list;
    }
}

429.N叉树的层序遍历

class Solution {
    public List<List<Integer>> levelOrder(Node root) {
          List<List<Integer>> res = new ArrayList<>();
        if(root == null) return res;
        //队列存储,进行层序遍历
        Queue<Node> q = new ArrayDeque<>();
        //第一个入队
        q.add(root);
        while(!q.isEmpty()){
            //记录每一行的
            ArrayList<Integer> row = new ArrayList<>();
            int n = q.size();
            //因为先进入的是根节点,故每层节点多少,队列大小就是i多少
            for(int i=0;i<n;i++){
                //接收临时
                Node cur = q.poll();
                row.add(cur.val);
                // //若是左右孩子存在,则存入左右孩子作为下一次层次
                // if(cur.left!=null) q.add(cur.left);
                // if(cur.right !=null) q.add(cur.right);
                List<Node> children = cur.children;
                if(children == null || children.size()==0) continue;
                for(Node child:children){
                    if(child!=null) q.add(child);
                }
            } 
            //每一层加入输出
            res.add(row);
        }
        return res;
    }
}

515.在每个树行中找最大值

class Solution {
    public List<Integer> largestValues(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        if(root == null) return res;
        Queue<TreeNode> q = new ArrayDeque<>();
        q.add(root);
        while(!q.isEmpty()){
            //记录最大值
            int maxVal = Integer.MIN_VALUE;
            int len = q.size();
            for(int i=0;i<len;i++){
                //当前访问节点
                TreeNode cur = q.poll();
                if(maxVal<cur.val) maxVal = cur.val;
                //左右子树不为空进行记录
                if(cur.left!=null) q.add(cur.left);
                if(cur.right!=null) q.add(cur.right);
            }

            //结束时记录
            res.add(maxVal);
        }
        return res;
    }
}

116.填充每个节点的下一个右侧节点指针、
117.填充每个节点的下一个右侧节点指针II

class Solution {
    public Node connect(Node root) {
        if(root == null) return root;
        Queue<Node> q = new LinkedList<>();
        q.add(root);
        while(!q.isEmpty()){
            int len =q.size();
            for(int i=0;i<len;i++){
                //当前节点
                Node cur = q.poll();
                //指向next
                if(i< len-1){
                    cur.next = q.peek() ;//出了队列,因此peek指向的就是下一个元素
                }
                //把node的左右孩子加入
                if(cur.left!=null) q.add(cur.left);
                if(cur.right!=null) q.add(cur.right);
            }
        }
        return root;
    }
}

104.二叉树的最大深度

class Solution {
    public int maxDepth(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        if(root == null) return 0;
        //队列存储,进行层序遍历
        Queue<TreeNode> q = new ArrayDeque<>();
        //第一个入队
        q.add(root);
        while(!q.isEmpty()){
            //记录每一行的
            ArrayList<Integer> row = new ArrayList<>();
            int n = q.size();
            //因为先进入的是根节点,故每层节点多少,队列大小就是i多少
            for(int i=0;i<n;i++){
                //接收临时
                TreeNode cur = q.poll();
                row.add(cur.val);
                //若是左右孩子存在,则存入左右孩子作为下一次层次
                if(cur.left!=null) q.add(cur.left);
                if(cur.right !=null) q.add(cur.right);
            } 
            //每一层加入输出
            res.add(row);
        }
        return res.size();
    }
}class Solution {
    public int maxDepth(TreeNode root) {
        if (root == null)   return 0;
        Queue<TreeNode> que = new LinkedList<>();
        que.offer(root);
        int depth = 0;
        while (!que.isEmpty())
        {
            int len = que.size();
            while (len > 0)
            {
                TreeNode node = que.poll();
                if (node.left != null)  que.offer(node.left);
                if (node.right != null) que.offer(node.right);
                len--;
            }
            depth++;
        }
        return depth;
    }
}

111.二叉树的最小深度

class Solution {
    public int minDepth(TreeNode root) {
        if(root == null) return 0;
        Queue<TreeNode> q = new LinkedList<>();
        q.add(root);
        int depth = 0;
        while(!q.isEmpty()){
            int len = q.size();
            depth++;
            for(int i=0;i<len;i++){
                TreeNode cur  = q.poll();
                //如果当前节点的左右子树都为空,说明就是最小高度
                if(cur.left == null && cur.right == null) return depth;
                if(cur.left !=null) q.add(cur.left);
                if(cur.right !=null) q.add(cur.right);
            }
        }

        return depth;
    }
}

2、226. 翻转二叉树

在这里插入图片描述

DFS

class Solution {
    public TreeNode invertTree(TreeNode root) {
        //使用前序遍历
        if(root == null) return null;
        //前
        swap(root);
        invertTree(root.left);
        invertTree(root.right);
        return root;
    }
    public void swap(TreeNode node){
        TreeNode temp = node.left;
        node.left = node.right;
        node.right = temp;
    }
}

BFS

class Solution {
    public TreeNode invertTree(TreeNode root) {
        //使用前序遍历
        // if(root == null) return null;
        // //前
        // swap(root);
        // invertTree(root.left);
        // invertTree(root.right);
        // return root;
        if(root == null) return null;
        //层序遍历
        Queue<TreeNode> q = new LinkedList<>();
        q.add(root);

        while(!q.isEmpty()){
            int len = q.size();
            for(int i=0;i<len;i++){
                TreeNode cur = q.poll();
                swap(cur);
                if(cur.left!=null) q.add(cur.left);
                if(cur.right!=null) q.add(cur.right);
            }
        }

        return root;

    }
    public void swap(TreeNode node){
        TreeNode temp = node.left;
        node.left = node.right;
        node.right = temp;
    }
}

3、101. 对称二叉树

在这里插入图片描述
左节点为空,右节点不为空,不对称,return false
左不为空,右为空,不对称 return false
左右都为空,对称,返回true
此时已经排除掉了节点为空的情况,那么剩下的就是左右节点不为空:

左右都不为空,比较节点数值,不相同就return false
此时左右节点不为空,且数值也不相同的情况我们也处理了。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public boolean isSymmetric(TreeNode root) {
        return compare(root.left,root.right);

    }

    public boolean compare(TreeNode left,TreeNode right){
        //左节点为空,右节点不为空,不对称,return false
        if(left == null && right !=null) return false;
        //左节点不为空,右节点为空,不对称
        if(left!=null && right == null) return false;
        //左右节点都为空,说明对称
        if(left==null && right == null) return true;

        //左节点不等于右节点
        if(left.val !=right.val){
            return false;
        }

        //比较外侧
        boolean c = compare(left.left,right.right);

        //比较内测
        boolean d = compare(left.right,right.left);

        return c&&d;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/509796.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一心报国的西工大网安人走出新手村

大二下学期5月5日晚上&#xff0c;西工大长安校区教学西楼&#xff0c;作为一名网安专业本科生&#xff0c;从大一便立志学好网安知识&#xff0c;报效祖国&#xff0c;却苦于没有优秀学习资源&#xff0c;就把这事儿拖到了大二&#xff0c;最近上了一门专业课&#xff0c;如同…

Wireshark抓包:详解TCP四次挥手报文内容

一、详解tcp四次挥手 刚才用图解释了tcp四次挥手的过程。用wireshark抓一个包&#xff0c;进行详细的分析。 1.客户端发的第一个释放连接的请求 这是抓的包&#xff0c;然后过滤出来的&#xff0c;看下最后的阶段&#xff0c;是要开始释放一个链接了。这里是第一个fin&#…

PSP - 适配不同来源的 AlphaFold2 MSA 接口

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/130594303 MSA (Multiple Sequence Alignment) 在 AlphaFold2 中的工作方式如下: 使用搜索工具 (hhblits/hhsearch/jackhmmer),从大型数据库中,搜索与目标…

如何快速构建 Zabbix 原生高可用?

Zabbix Meetup成都站议程 14:30 《如何快速构建 Zabbix 原生高可用》 周松&#xff0c;Zabbix 大中华区培训师&#xff0c;架构师 15:00 《基于 Zabbix 开发的拨测平台–OneMonitor》 唐荣&#xff0c;社区用户 15:30 《Zabbix 与信创生态的融合》 侯健&#xff0c;上海宏…

VS安装项目生成错误提示:SQL Server 2008 R2 SP2 Management Studio

错误提示内容&#xff1a; 原因是在Visual Studio XXXX中创建设置时遇到错误。 提示错误信息&#xff1a; 0:Watson 1:1304 2:StreamSupportFiles 3:streamBinaryToDisk 4:5 5.e:lsql10 main tlsgllsetupidarwinsglcastublstreamca.cpp 6:238 7:sglcastub.dll 8:sglrun.msi 点…

Python每日一练(20230510) 石子游戏 VII\VIII\IX

目录 1. 石子游戏 Stone Game VII 2. 石子游戏 Stone Game VIII 3. 石子游戏 Stone Game IX &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 石子游戏 Stone Game VII 石子游戏中&…

Android音视频开发之音频录制和播放

1.封装音频录制工具类&#xff1a; public class RecorderAudioManagerUtils {private static volatile RecorderAudioManagerUtils mInstance;public static RecorderAudioManagerUtils getInstance() {if (mInstance null) {synchronized (RecorderAudioManagerUtils.class…

【连续介质力学】简介

什么是连续介质力学 连续介质力学的假设 连续介质力学的流体性质&#xff1a;质量密度&#xff0c;压强和速度假设为连续函数 将原子系统看作是连续 分子的平均自由程&#xff1a; Λ \Lambda Λ 物理特征长度&#xff1a; l c l_c lc​ 克劳森数&#xff08;Knudsen number…

数字城市发展,哪些技术可以深度应用

说到数字城市、智慧城市大家都会觉得经常在耳边听到&#xff0c;但是要确切的说出具体的概念还是有一些难度的。具体来讲&#xff1a;数字城市是一个集合多种技术的系统&#xff0c;以计算机技术、多媒体技术和大规模存储技术为基础&#xff0c;以宽带网络为纽带&#xff0c;运…

Grafana 系列-统一展示-5-AWS Cloudwatch 仪表板

系列文章 Grafana 系列文章 &#x1f44d;️强烈推荐 强烈推荐使用 GitHub 上的 monitoringartist/grafana-aws-cloudwatch-dashboards 仪表板。该 repo 有一系列 AWS 资源的仪表板&#xff0c;包括但不限于&#xff1a; EC2EBSAPI GWAutoscalingBillingEKSLambdaLogsRDSS3…

Unity3D :树

推荐&#xff1a;将 NSDT场景编辑器 加入你的3D工具链 3D工具集&#xff1a; NSDT简石数字孪生 树 可使用类似于绘制高度贴图和纹理的方式在地形上绘制树。然而&#xff0c;树是从表面生长的 3D 对象实体。Unity 使用优化&#xff08;比如针对远处树的公告牌&#xff09;来保持…

关于 std::condition_variable

一. std::condition_variable是什么&#xff1f; std::condition_variable 是 C 标准库提供的一个线程同步的工具&#xff0c;用于实现线程间的条件变量等待和通知机制。 条件变量的发生通常与某个共享变量的状态改变相关。 在多线程编程中&#xff0c;条件变量通常和互斥锁…

Mac执行ruby命令提示 dyld: Library not loaded等类似问题解决方案

说一下为啥会遇见这么个问题&#xff0c;我在给一个xcode项目添加podfile的时候&#xff0c;在终端执行了pod init命令&#xff0c;随即给了我一个如下图的提示&#xff08;报错信息一样的&#xff0c;执行pod的命令早就被解决问题过程中频繁的下载过程刷上去了。。。&#xff…

对于档案室内部设备硬件及温湿度的要求

编辑搜图 请点击输入图片描述&#xff08;最多18字&#xff09; 档案室温湿度及硬件要求 一、各档案库的建筑及技术参数&#xff1a; 1.各馆室的最小面积应能容纳目前各资料存放&#xff0c;还必须考虑一定的发展空间。 2.地板承重最大容量为1240公斤/平米&#xff0c;采用…

为什么hooks不能在循环、条件或嵌套函数中调用

hooks不能在循环、条件或嵌套函数中调用 为什么&#xff1f; 带着疑问一起去看源码吧&#xff5e; function App() {const [num, setNum] useState(0);const [count, setCount] useState(0);const handleClick () > {setNum(num > num 1)setCount(2)}return <p …

HTML + CSS + JavaScript【实战案例】 实现动画导航栏效果

​Hello~ 咱们今天一起来学习一个动画导航的小项目 Part 1 HTML结构 <body><nav class"active" id"nav"><ul><li><a href"#">Home</a></li><li><a href"#">Works</a>&…

MySQL---多表联合查询(上)(多表关系、外键约束、学生成绩多表关系、交叉连接查询)

1. 多表关系 MySQL多表之间的关系可以概括为&#xff1a; 一对一&#xff1a; 比如&#xff1a;一个学生只有一张身份证&#xff1b;一张身份证只能对应一学生。 实现原则&#xff1a;在任一表中添加唯一外键&#xff0c;指向另一方主键&#xff0c;确保一对一关系。 一般一对…

JumpServer Harbor CCE ELK

Jumpserver是一款开源的堡垒机&#xff0c;可使系统的管理员和开发人员安全的连接到企业内部服务器上执行操作&#xff0c;并且支持大部分操作系统&#xff0c;是一款非常安全的远程连接工具 安装JumpServer jumpserver.org官网去下载安装&#xff0c;有一键安装&#xff08;里…

克服田间果园环境下非结构化背景挑战的果实检测优化策略

文章目录 摘要复杂的背景因素和消极影响照明条件水果遮挡现象不同成熟度的水果 参考 摘要 由于世界粮食和环境危机的持续影响&#xff0c;对智能农业的需求正在增加。以水果检测为重点&#xff0c;随着目标检测技术的快速发展&#xff0c;现在可以在水果检测系统中实现高精度。…

OpenGL(十三)——世界光照

目录 一、前言 二、平行光 2.1 片段着色器 2.2 app渲染 三、点光源 3.1 距离衰减 3.2 衰减片段着色器 四、聚光 4.1 片段着色器 4.2 光照入射方向 4.3 平滑边缘 一、前言 Light Caster &#xff1a;光投射&#xff08;Cast&#xff09;到物体的光源。现实世界中通常多…