leecode 226 翻转二叉树、101 对称二叉树、104 二叉树的最大深度

news2024/11/17 21:28:10
leecode 226 翻转二叉树、101 对称二叉树、104 二叉树的最大深度
leecode 226 翻转二叉树
题目链接 :https://leetcode.cn/problems/invert-binary-tree/description/
题目

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

示例 1:
在这里插入图片描述
输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]

示例 2:
在这里插入图片描述
输入:root = [2,1,3]
输出:[2,3,1]

示例 3:
输入:root = []
输出:[]

提示:
树中节点数目范围在 [0, 100] 内
-100 <= Node.val <= 100

解题思路

这道题其实就是对二叉树的每个节点进行交换,其实就跟数值交换差不多,只不过这里是在二叉树。一般遇到二叉树相关题目,想一下使用哪一种遍历顺序,前中后。这道题来说,前序和后序基本都可以,如果是中序的话,某些节点可能要交换两次,因为中序遍历逻辑是左中右,在中进行交换,然后再遍历到右节点,这不是相当于把原来交换的再次交换了吗。具体实现代码为:

class Solution {
    public TreeNode invertTree(TreeNode root) {
        if (root == null) return root;
        traverseMid(root);
        return root;
    }

    public void traverse(TreeNode root) {
        if (root == null) return; //递归终止条件

        traverse(root.left); //左
        traverse(root.right);  //右
        TreeNode tmp = root.left;  //中
        root.left = root.right;
        root.right = tmp;
    }
}
//或者不用辅助函数
class Solution {
    public TreeNode invertTree(TreeNode root) {
        if (root == null) return root; //递归终止条件
        TreeNode left = invertTree(root.left);  //左
        TreeNode right = invertTree(root.right);  //右
        root.left = right; //中
        root.right = left;
        return root;
    }
}
leecode 101 对称二叉树
题目链接 :https://leetcode.cn/problems/symmetric-tree/description/
题目

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

示例 1:
在这里插入图片描述

输入:root = [1,2,2,3,4,4,3]
输出:true

示例 2:
在这里插入图片描述
输入:root = [1,2,2,null,3,null,3]
输出:false

提示:
树中节点数目在范围 [1, 1000] 内
-100 <= Node.val <= 100

解题思路

这道题我们要清楚,要比较的不是左右节点,而是根节点的左右两棵树,所以在遍历的过程中,两棵树要同时遍历。那要哪种遍历顺序呢,因为同时比较两棵树的左右节点,那哪个遍历顺序通过返回值是能拿到左右节点信息的呢。就是后续遍历了。
那这道题的递归终止条件是什么呢,这道题是个判断题,一旦有符合的就直接返回。从示例中可以看到,左子树的左节点的值要等于右子树的右节点的值,左子树的右节点的值要等于右字数的左节点的值。所以这个是递归中的语句。那不满足的就是返回false就行了,递归条件有以下几种:
1.左子树为空右子树不为空 if (left == null && right != null) return false;
2.左子树不为空右子树为空 if (right == null && left != null) return false
3.左子树和右子树都为空,这是符合的 if (left == null && right == null) return true;
4.左子树的值不等于右子树的值 if (left.val != right.val) return false;
其中第4点一定是在前面三点判断完后开始判断,因为要不为空才有值。

class Solution {
    public boolean isSymmetric(TreeNode root) {
        return compare(root.left,root.right); //两棵树同时遍历
    }
    public boolean compare(TreeNode left,TreeNode right) {
        if (left == null && right != null) return false; //1.左子树为空右子树不为空
        if (right == null && left != null) return false; //2.左子树不为空右子树为空
        if (left == null && right == null) return true; //3.左子树和右子树都为空
        if (left.val != right.val) return false; //4.左子树的值不等于右子树的值
        boolean out = compare(left.left,right.right); //左
        boolean inner = compare(left.right,right.left); //右
        return out && inner; //中
    }
}
leecode 104 二叉树的最大深度
题目链接 :https://leetcode.cn/problems/maximum-depth-of-binary-tree/description/
题目

给定一个二叉树 root ,返回其最大深度。

二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

示例 1:
在这里插入图片描述
输入:root = [3,9,20,null,null,15,7]
输出:3

示例 2:
输入:root = [1,null,2]
输出:2

提示:
树中节点的数量在 [0, 104] 区间内。
-100 <= Node.val <= 100

解题思路

这道题用层序遍历可以套模板。这篇文章主要是说二叉树的递归。对于二叉树的最大深度,最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。那我们可以用前序遍历一路遍历下去,遍历到下一层,深度加一,不过要注意的是,在返回去的时候,深度要相应的减一,此时就涉及到回溯了。也可以用后序遍历,拿到左右值后深度加一。注意递归结束条件,是当root==null,return 0;取左右子树深度的最大值加上根节点这一层即可。当然,中序遍历也是一样的。具体代码为:

//后序遍历
class Solution {
    public int maxDepth(TreeNode root) { 
        if (root == null) return 0; //递归终止条件
        int left = maxDepth(root.left); //左
        int right = maxDepth(root.right); //右
        return Math.max(left,right) + 1; //中
    }
}
//前序遍历
class Solution {
    int res = 0;
    public int maxDepth(TreeNode root) {
        int length = 0;
        traverse(root,length);
        return res;
    }
    public void traverse(TreeNode root,int length) {
        if (root == null) return;
        length++;
        res = Math.max(res,length); //中
        traverse(root.left,length); //左
        traverse(root.right,length); //右
        length--; //回溯
    }
}
//中序遍历
class Solution {
    int res = 0;
    public int maxDepth(TreeNode root) {
        int length = 0;
        traverse(root,length);
        return res;
    }
    public void traverse(TreeNode root,int length) {
        if (root == null) return;
        length++;
        traverse(root.left,length); //左
        res = Math.max(res,length); //中
        traverse(root.right,length); //右
        length--;  //回溯
    }
}

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

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

相关文章

Neovim 配置全面解析(上)

Neovim 配置全面解析&#xff08;上&#xff09; 原文&#xff1a;Neovim 配置全面解析&#xff08;上&#xff09; - 知乎 (zhihu.com) 环境&#xff1a;Ubuntu 20.04 宿主机&#xff1a;windows &#xff08;windows terminal&#xff09;WSL 2 NVIM&#xff1a;v 0.10.0-de…

自从有了可观测性,传统运维如何进行提升?

在 201x 年&#xff0c;随着容器技术的出现&#xff0c;容器的部署方式逐渐被各大互联网公司采用&#xff0c;相比物理机/虚拟机&#xff0c;容器的好处是环境隔离、轻量、快速。 但是管理容器是一件复杂的事情&#xff0c;后来出现了 Kubernetes&#xff0c;成为了事实上的容…

Python编程的黑暗魔法:模块与包的神秘力量!

哈喽&#xff0c;我是阿佑&#xff0c;今天给大家讲讲模块与包~ 文章目录 1. 引言1.1 模块化编程的意义1.2 Python中模块与包的概念概述 2. 背景介绍2.1 Python模块系统模块的定义与作用Python标准库简介 2.2 包的结构与目的包的定义与目录结构包在项目组织中的重要性 3. 创建与…

网络攻击攻击之-远程命令执行/RCE告警运营分析篇

在各种网络安全产品的告警中,远程命令执行是一种非常常见的告警。本文将从远程命令执行的定义,远程命令执行利用的流量数据包示例,远程命令执行的suricata规则,远程命令执行的告分析警研判,远程命令执行的处置建议等几个方面阐述如何通过IDS/NDR,态势感知等流量平台的远程…

Linux系统编程(三)进程间通信(IPC)

本文目录 一、linux 进程之间的通信种类二、管道1. 管道的概述2. 什么是管道文件&#xff1f;3. 管道的特点4. 管道类型&#xff08;1&#xff09;无名管道&#xff08;pipe&#xff09;&#xff08;2&#xff09;有名(命名)管道&#xff08;fifo&#xff09; 三、信号&#xf…

自定义Linux命令,显示docker镜像、容器信息

1、修改环境变量&#xff08;仅对当前用户有效&#xff09; vim ~/.bashrc2、给命令取别名 alias dpsdocker ps --format "table{{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}" alias disdocker images#保存并退出 :wq3、让配置重新生效 source ~/.bashrc4、测试&…

前端设计模式学习记录

设计模式介绍 概念 设计模式是我们在解决问题的时候针对特定的问题给出的简洁而优化的处理方案在JS设计模式中&#xff0c;最核心的思想&#xff1a;封装变化将变与不变分离&#xff0c;确保变化的部分灵活、不变的部分稳定 注意&#xff1a;下面文章介绍的设计模式&#xff…

shell脚本实战--批量修改文件名

字符串截取 先来了解一下shell字符串相关操作的变量 # 从开头删除匹配最短 ## 从开头删除匹配最长 % 从结尾削除匹配最短 %% 从结尾删除匹配最长#指定字符内容截取 a*c 匹配开头为a&#xff0c;中间任意个字符&#xff0c;结尾为c的字符串 a*C 匹配…

​​​【收录 Hello 算法】10.4 哈希优化策略

目录 10.4 哈希优化策略 10.4.1 线性查找&#xff1a;以时间换空间 10.4.2 哈希查找&#xff1a;以空间换时间 10.4 哈希优化策略 在算法题中&#xff0c;我们常通过将线性查找替换为哈希查找来降低算法的时间复杂度。我们借助一个算法题来加深理解。 Question 给…

LINGO:存贮问题

存贮模型中的基本概念 模型&#xff1a; 基本要素&#xff1a; &#xff08;1&#xff09;需求率&#xff1a;单位时间内对某种物品的需求量&#xff0c;用D表示。 &#xff08;2&#xff09;订货批量&#xff1a;一次订货中&#xff0c;包含某种货物的数量&#xff0c;用 Q表…

AI网络爬虫-从当当网批量获取图书信息

工作任务和目标&#xff1a;用户输入一个图书名称&#xff0c;然后程序自动从当当网批量获取图书信息 查看相关元素在源代码中的位置&#xff1a; 第一步&#xff1a;在deepseek中输入提示词&#xff1a; 你是一个Python爬虫专家&#xff0c;一步步的思考&#xff0c;完成以下…

Linux定时计划

定时计划 一、计划任务种类 突发性&#xff1a;临时决定只执行一次的任务 at&#xff1a;处理执行一次任务就结束定时性&#xff1a;每隔一定时间需要重复执行此命令 crontab&#xff1a;指定任务&#xff0c;按照设定的周期一直循环执行二、作用 定时任务可以用于自动备份…

AI办公自动化:用kimi批量将word文档部分文件名保存到Excel中

文件夹中有很多个word文档&#xff0c;现在只要英文部分的文件名&#xff0c;保存到一个Excel文件中。 可以在kimi中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个编写Python脚本的任务&#xff0c;具体步骤如下&#xff1a; 打开文件夹&#xff1a;…

51单片机-实机演示(LED,呼吸,蜂鸣器)

一&#xff0c;LED点灯 #include "REG52.H"sbit LED P0^0;void main() {LED 1;while (1){} }控制P00输出。 烧录 重启 再换个引脚插入的位置。 二&#xff0c;蜂鸣器 代码&#xff0c;和烧录步骤同上。 只需要换一下&#xff0c;引脚位置即可 三&#xff0c;呼…

jmeter之MD5加密接口请求教程

前言&#xff1a; 有时候在项目中&#xff0c;需要使用MD5加密的方法才可以登录&#xff0c;或者在某一个接口中遇到 登录获取token后才可以进行关联&#xff0c;下面介绍下遇到的常见使用 一、第一种方法&#xff1a;使用jmeter自带的函数助手digest 选择工具&#xff0c;选择…

ssm整合教程

目录 写在前面 目录结构 添加依赖 web.xml jdbc.properties spring.xml mybatis.xml springmvc.xml pom.xml额外配置 last&#xff1a;写个测试样例看看整合成功没。 User.java UserDao.java(接口) UserController.java UserService.java UserServiceImpl.java …

人工智能在鼻咽癌领域的最新应用|【医学AI·论文速递·05-27】

小罗碎碎念 2024-05-27&#xff5c;文献速递 接下来打算把人工智能在主流癌种治疗中的应用&#xff0c;每天和大家做一期推送&#xff0c;方便大家了解各自领域最新的一个进展。 因为小罗的课题是鼻咽癌相关的&#xff0c;所以这一期推文就先从人工智能在鼻咽癌中最新的应用开…

MyBatis框架的使用:mybatis介绍+环境搭建+基础sql的使用+如何使用Map传入多个参数+返回多个实体用List或者Map接收+特殊sql的使用

MyBatis框架的使用&#xff1a;mybatis介绍环境搭建基础sql的使用如何使用Map传入多个参数返回多个实体用List或者Map接收特殊sql的使用 一、MyBatis介绍1.1 特性1.2 下载地址1.3 和其它持久层技术对比 二、搭建环境2.1配置maven2.2 创建mybatis配置文件2.3 搭建测试环境 三、基…

【CTF Web】CTFShow web7 Writeup(SQL注入+PHP+进制转换)

web7 1 阿呆得到最高指示&#xff0c;如果还出问题&#xff0c;就卷铺盖滚蛋&#xff0c;阿呆心在流血。 解法 注意到&#xff1a; <!-- flag in id 1000 -->拦截很多种字符&#xff0c;连 select 也不给用了。 if(preg_match("/\|\"|or|\||\-|\\\|\/|\\*|\…

宿舍管理系统代码详解(操作界面)

目录 一、前端代码 1.样式展示 2.代码详解 <1>主页面列表部分 &#xff08;1&#xff09;template部分 &#xff08;2&#xff09;script部分 <2>新增页面 &#xff08;1&#xff09;template部分 &#xff08;2&#xff09;script部分 <3>修改页面…