【力扣刷题】二叉树的中序遍历、二叉树的最大深度、翻转二叉树、对称二叉树

news2024/11/14 18:41:06

在这里插入图片描述

🐌个人主页: 🐌 叶落闲庭
💨我的专栏:💨
c语言
数据结构
javaEE
操作系统
Redis

石可破也,而不可夺坚;丹可磨也,而不可夺赤。


刷题篇

  • 一、二叉树的中序遍历
    • 1.1 题目描述
    • 1.2 思路分析
    • 1.3 代码演示
  • 二、二叉树的最大深度
    • 2.1 题目描述
    • 2.2 思路分析
    • 2.3 代码演示
  • 三、翻转二叉树
    • 3.1 题目描述
    • 3.2 思路分析
    • 3.3 代码演示
  • 四、对称二叉树
    • 4.1 题目描述
    • 4.2 思路分析
    • 4.3 代码演示

一、二叉树的中序遍历

1.1 题目描述

给定一个二叉树的根节点 root ,返回它的中序遍历 。


在这里插入图片描述


在这里插入图片描述


1.2 思路分析

返回二叉树的中序遍历,就是在遍历二叉树的时候,先访问二叉树的左子节点,然后访问二叉树的根节点,最后访问二叉树的右子节点,对于每个子节点,也是这样访问。
对于一个给定的二叉树,可以通过栈来实现它的中序遍历:

  • 要求:返回一个集合,集合中的元素是二叉树中序遍历后的节点值
  • 定义一个集合,用来作为返回值,当二叉树为空时,返回一个空集合
  • 二叉树不为空,则定义一个栈,用来实现二叉树的中序遍历,定义一个节点指针cur,表示当前节点,当cur不为空或者栈不为空时,进入循环,在循环内再嵌套一个条件为cur不为空的循环,在嵌套的循环中将当前节点加入到栈中,并将当前节点指向当前节点的左子节点,直到将所有的左子节点均添加到栈中,内嵌循环结束,外部循环继续执行,将此时的栈顶元素弹出,并将弹出的节点值加入到集合中,将cur指向弹出的栈顶元素的右子节点,循环遍历,直到栈为空时退出循环,返回集合。

1.3 代码演示

public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        if (root == null) {
            return list;
        }
        //定义一个栈
        Stack<TreeNode> stack = new Stack<>();
        //定义当前节点指针
        TreeNode cur = root;
        while(cur != null || !stack.empty()) {
            while(cur != null) {
                stack.push(cur);
                cur = cur.left;
            }
            TreeNode top = stack.pop();
            list.add(top.val);
            cur = top.right;
        }
        return list;
    }

二、二叉树的最大深度

2.1 题目描述

给定一个二叉树 root ,返回其最大深度。
二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。


在这里插入图片描述


在这里插入图片描述


2.2 思路分析

根据题目分析,可以对二叉树进行层序遍历(最广深度优先),每遍历一层,深度数加1,当遍历到最后一层,此时的深度数就是这个二叉树的最大深度,对于二叉树的层序遍历,可以采用队列的方式实现:

  • 当二叉树为空时:返回0
  • 当二叉树非空,定义一个整型变量表示要返回的深度数,创建队列,并将根节点加入到队列中,当队列不为空时,开始对二叉树的每一层进行遍历,内嵌循环当队列的大小大于0时,开始内嵌循环,弹出队首元素,并记录这个节点,判断弹出的节点是否有左右子节点,若有将左右子节点加入队列,然后队列的大小自减继续内嵌循环的执行,当内嵌循环结束时,标志着第一层遍历结束,此时要将深度数自增1,开始第二层遍历,直到整个队列为空时,循环结束,返回深度数。

2.3 代码演示

public int maxDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        //定义要返回的深度数
        int result = 0;
        //创建队列
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        queue.offer(root);
        while(!queue.isEmpty()) {
            //根据队列的大小决定内层循环
            int size = queue.size();
            while(size > 0) {
                //弹出队首元素
                TreeNode top = queue.poll();
                //判断队首元素是否存在左右子元素
                if(top.left != null) {
                    //将左子元素添加到队列中
                    queue.offer(top.left);
                }
                if(top.right != null) {
                    //将右子元素添加到队列中
                    queue.offer(top.right);
                }
                //遍历结束size自减1
                size--;
            }
            //每层循环结束返回的深度数自增1
            result++;
        }
        return result;
    }

三、翻转二叉树

3.1 题目描述

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。


在这里插入图片描述


在这里插入图片描述


3.2 思路分析

将一棵二叉树进行翻转得到新的二叉树,可以通过队列实现,每次向队列中添加元素,弹出时交换该元素左右子节点的位置,遍历每一个节点:

  • 当二叉树为空时:返回空
  • 当二叉树不为空,创建一个队列,将根节点加入队中,当队列不为空时,开始外部循环,定义一个整型表示队列的大小,当队列的大小大于0时,开始内部循环,在内部循环中,先将队首元素弹出,并定义一个变量记录弹出的节点,然后判断该节点是否有左右子节点,若有则添加到队列中,然后交换弹出元素的左右子节点的位置,size自减1,若队列中无元素则开始遍历第二层,第二层队列的大小为2.大于0,则开始内部循环,同样弹出队首元素,并判断是否存在左右子节点,若存在就加入到队中,然后交换弹出的队首元素的左右子节点的位置,size自减1,之后为1,继续内部循环,仍弹出队首元素并判断是否有左右子节点,若有则添加到队列中,然后交换队首元素左右子节点的位置,size自减1,跳出内部循环,开始第三层遍历,直到外部循环判断条件的队列为空时整个循环结束,返回root根节点。

3.3 代码演示

public TreeNode invertTree(TreeNode root) {
        //非空判断
        if(root == null) {
            return null;
        }
        //创建一个队列
        Queue<TreeNode> queue = new LinkedList<>();
        //将初始根节点添加到队列中
        queue.offer(root);
        while(!queue.isEmpty()) {
            //拿到队列此时的大小,开始遍历
            int size = queue.size();
            while(size > 0) {
                //将队首元素弹出
                TreeNode top = queue.poll();
                //判断队首元素是否有左右子元素
                if(top.left != null) {
                    //将左元素入队
                    queue.offer(top.left);
                }
                if(top.right != null) {
                    //将右元素入队
                    queue.offer(top.right);
                }
                //交换队首元素左右子元素的位置
                TreeNode temp = top.left;
                top.left = top.right;
                top.right = temp;
                //size自减继续判断子元素是否有子元素
                size--;
            }
        }
        return root;
    }

四、对称二叉树

4.1 题目描述

给你一个二叉树的根节点root , 检查它是否轴对称。


在这里插入图片描述


在这里插入图片描述


4.2 思路分析

判断二叉树的左右子节点是否关于根节点轴对称,可以通过递归判断(比较简单),也可以通过队列对这个二叉树进行遍历,每遍历一个节点就判断它的左右子节点是否相等从而判断出是否关于根节点轴对称:

  • 1.递归:
    • 当根为null时,表示二叉树为空,此时应返回true
    • 当根不为null时,返回递归函数,递归函数的参数为根的左子节点和根的右子节点。递归函数中判断若两个参数均为空则返回true,若只有一个参数为空则返回false,若两个参数的值不相等,同样返回false,最后函数的返回值为回调两次递归函数并将这两个递归函数左与(即&&),两个函数的参数分别为(左左,右右)和(左右,右左)。
    1. 队列:
    • 当根节点为空或者根的左为空同时根的右为空时,返回true
    • 创建队列,将根的左右子元素加入队列中,当队列不为空时,弹出两个元素,若两个元素均为空,则直接进行下一次循环判断,还是循环遍历从队列中弹出两个元素判断它们的值是否相等,若不相等,直接返回false,若某个节点为空,直接返回false,若两个节点都不为空,则向队列中添加左的左,右的右,左的右,右的左,再次循环判断,若能跳出循环,表示这个二叉树的左右子节点就是一根为轴的对称二叉树。

4.3 代码演示

  • 递归:
public boolean isSymmetric(TreeNode root) {
     //递归思想
     if(root == null) {
         return true;
     }
     return dfs(root.left,root.right);
}   

public boolean dfs(TreeNode left,TreeNode right) {
        if(left == null && right == null) {
            return true;
        }
        if (left == null || right == null) {
            return false;
        }
        if (left.val != right.val) {
            return false;
        }
        return dfs(left.left,right.right) && dfs(left.right,right.left);
    }
  • 队列:
public boolean isSymmetric(TreeNode root) {
        if(root == null || (root.left == null && root.right == null)) {
            return true;
        }
        //创建队列
        Queue<TreeNode> queue = new LinkedList<>();
        //将二叉树的左右子元素放入队列中
        queue.offer(root.left);
        queue.offer(root.right);
        while(queue.size() > 0) {
            TreeNode left = queue.poll();
            TreeNode right = queue.poll();
            if(left == null && right == null) {
                continue;
            }
            if (left == null || right == null) {
                return false;
            }
            if (left.val != right.val) {
                return false;
            }
            queue.offer(left.left);
            queue.offer(right.right);
            queue.offer(left.right);
            queue.offer(right.left);
        }
        return true;
    }

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

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

相关文章

分布式共识算法及落地

摘要 本文介绍常见的分布式共识算法&#xff0c;使用场景&#xff0c;以及相关已经落地了的程序或框架 1. 为什么要分布式共识算法 在分布式系统中&#xff0c;不同节点之间可能存在网络延迟、故障等原因导致彼此之间存在数据不一致的情况&#xff0c;为了保证分布式系统中的…

【Qt】消息机制和事件

文章目录 事件event()事件过滤器案例&#xff1a;检测鼠标事件案例&#xff1a;定时器 事件 事件&#xff08;event&#xff09;是由系统或者 Qt 本身在不同的时刻发出的。当用户按下鼠标、敲下键盘&#xff0c;或者是窗口需要重新绘制的时候&#xff0c;都会发出一个相应的事…

微信小程序进阶——后台交互个人中心授权登录

目录 一、小程序登录微信登录接口演示 1.1 项目导入 1.2 method1 1.3 method2 二、小程序授权登录 2.1 登录过程 2.1.1 详解 2.1.2 图解 2.2 后端代码导入 2.3 前端代码导入 ​编辑 2.4 案例演示 前端代码如下&#xff1a; 2.4.1 前端调用接口地址 2.4.2 个人中…

Power BI 傻瓜入门 5. 准备数据源

本章内容将介绍&#xff1a; 定义Power BI支持的数据源类型探索如何在Power BI中连接和配置数据源了解选择数据源的最佳做法 现代组织有很多数据。因此&#xff0c;不用说&#xff0c;微软等企业软件供应商已经构建了数据源连接器&#xff0c;以帮助组织将数据导入Power BI等…

瑞萨e2studio(27)----使用EZ-CUBE3烧录

瑞萨e2studio.27--使用EZ-CUBE3烧录 概述视频教学样品申请引脚配置EZ-CUBE3 仿真器开关设置对RA族MCU进行Flash编程蓝色 LED 指示灯的状态信息 概述 EZ-CUBE3&#xff08;CYRCNEZCUBE03&#xff09;是具有Flash存储器编程功能的片上调试仿真器&#xff0c;可以用于调试MCU程序…

合同管理怎么做?套用Excel合同管理台账模板,真可以省心省力!

对于从事日常行政办公管理的人来说&#xff0c;最难受得就是各种合同乱糟糟&#xff0c;合同数据又多又杂&#xff0c;一不小心就会出错&#xff0c;而且有的合同数据到期了我们太忙也不知道&#xff0c;所以就很麻烦…… 想做好合同台账&#xff0c;其实很简单&#xff0c;今天…

基于stm32控制的ESP8266在设备模式下通讯

一、文章中要用的指令 指令作用ATUART115200,8,1,0,0之前的51通讯是9600&#xff0c;这里的321用的是115200&#xff0c;需要改一下波特率ATCWMODEXX是1代表station&#xff08;设备&#xff09;模式 &#xff0c;X是2代表AP&#xff08;路由&#xff09;模式 &#xff0c;X是…

微信小程序之个人中心授权登录

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《Spring与Mybatis集成整合》《Vue.js使用》 ⛺️ 越努力 &#xff0c;越幸运。 1.了解微信授权登录 微信登录官网&#xff1a; 小程序登录https://developers.weixin.qq.com/miniprogram/d…

YOLOv5源码中的参数超详细解析(2)— 配置文件yolov5s.yaml(包括源码+网络结构图)

前言:Hello大家好,我是小哥谈。配置文件yolov5s.yaml在YOLOv5模型训练过程中发挥着至关重要的作用,属于初学者必知必会的文件!在YOLOv5-6.0版本源码中,配置了5种不同大小的网络模型,分别是YOLOv5n、YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x,其中YOLOv5n是网络深度和宽度最小…

5G技术的飞速发展:连接未来

随着科技的日益进步&#xff0c;5G通讯技术已经成为了全球科技领域的热门话题。5G&#xff0c;即第五代移动通信技术&#xff0c;带来的不仅仅是更快的网络速度&#xff0c;它的高带宽和低延迟特性将为未来的数字世界奠定基础。 速度与效率的飞跃: 5G技术的最大亮点是它极高的下…

App分发的策略和注意事项

当今的数字化时代中&#xff0c;移动应用程序已经成为了人们生活中不可或缺的一部分。随着智能手机的普及和移动互联网的快速发展&#xff0c;应用程序的分发方式也变得越来越多样化。 App分发是指将移动应用程序通过特定的渠道传递给终端用户的过程。在应用程序开发完成后&am…

js轮转数组

给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步: [5,6,7,1,2,3,4…

OpenCV+QT实现的数字图像处理算法合集

源码下载地址&#xff1a; 基于OpenCV和QT的图像处理源码 图像预处理 灰度处理 灰度直方图 灰度均衡 梯度锐化 Laplace锐化 边缘检测 Roberts Sobel Laplace Prewitt canny Krisch 噪声 椒盐噪声 高斯噪声 滤波 均值滤波 中值滤波 双边滤波 形态学滤波 高斯滤波 图像变…

牛客网刷题-(1)

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

工作中几个问题的思考

对于需要并行多公司并行处理的任务&#xff0c;方案是什么&#xff1f; 多线程、并行流、并发库&#xff08;ExecutorService、Futrue、Callable&#xff09;&#xff0c;分布式计算&#xff08;1&#xff09;按照公司ID分片 &#xff08;2&#xff09;按照业务类型分片 处理…

当我让文心一言写个代码来庆祝1024程序员节,它写的代码是……

先让它写个自我介绍吧~ 大家好&#xff0c;我是一个人工智能语言模型&#xff0c;我的中文名是文心一言&#xff0c;英文名是ERNIE Bot。我可以协助您完成范围广泛的任务并提供有关各种主题的信息&#xff0c;比如回答问题&#xff0c;提供定义和解释及建议。如果您有任何问题…

单链表的实现(全注释promax版)

目录 前言&#xff1a; 哨兵位&#xff1a; 链表的概念 链表的相关操作&#xff1a; 链表的创建&#xff1a; 打印链表&#xff1a; 申请新节点&#xff1a; 链表的尾插&#xff1a; &#xff01;&#xff01;&#xff01;对于传参中二级指针的解释&#xff1a; 链表的…

解决使用WebTestClient访问接口报[185c31bb] 500 Server Error for HTTP GET “/**“

解决使用WebTestClient访问接口报[185c31bb] 500 Server Error for HTTP GET "/**" 问题发现问题解决 问题发现 WebTestClient 是 Spring WebFlux 框架中提供的用于测试 Web 请求的客户端工具。它可以不用启动服务器&#xff0c;模拟发送 HTTP 请求并验证服务器的响…

【UCAS自然语言处理作业一】利用BeautifulSoup爬取中英文数据,计算熵,验证齐夫定律

文章目录 前言中文数据爬取爬取界面爬取代码 数据清洗数据分析实验结果 英文数据爬取爬取界面动态爬取 数据清洗数据分析实验结果 结论 前言 本文分别针对中文&#xff0c;英文语料进行爬虫&#xff0c;并在两种语言上计算其对应的熵&#xff0c;验证齐夫定律github: ShiyuNee…

Java Static关键字 单例设计模式

类变量 类变量&#xff08;静态变量&#xff09;&#xff1a;有static修饰&#xff0c;属于类&#xff0c;在计算机中只有一份&#xff0c;被类的所有对象共享 可以通过类名访问&#xff0c;也可以通过对象名访问&#xff0c;但是推荐用类名访问类变量一般用public修饰&#xf…