[leetcode100] 101. 对称二叉树

https://leetcode.cn/problems/symmetric-tree/description/?envType=study-plan-v2&envId=top-100-liked

心血来潮,突然感觉很久没做leetcode,刷一题。
看到“简单”,哦吼,应该很快吧。
结果真是《简单》

题目描述

给你一个树,判断这个树是否根据根节点做中轴线是对称的。

思路

层级遍历

我的第一反应是,简单~
感觉不是层级遍历一下,得到一层信息之后,把他们拿出来,只要这个一层拿出来的序列是对称的,每一层都是对称的,就说明这个树就是对称的。
于是乎我就开始编码,写写写遇到第一个问题:
我该如何明确这一层已经结束了呢?
“聪明”的我觉得不是直接计数一下就完事了吗?第一层1,第二层2,第三层2*2…
但这个又个前提是,满二叉树才能够使用。“简单”~只要看到null进行填充就好啦~
于是我就开开心心写代码,提交然后WA笑死。

问题:因为如果使用层级遍历,并且填充的话,理论上是可以的,但是我用的层级遍历是使用队列进行遍历的。这就有一个问题

在这里插入图片描述

当你的第一层也就是2,2在queue里面的时候,这时候没问题,可以进行填充知道第二层应该是[nil, 2, 2, nil],并且也插入了队列[2,2]。
但是我当时写的逻辑是,我只要判断[nil, 2, 2, nil]这个成立之后就不管了,直接flush掉,这时候就有个问题,我怎么知道队列中的[2,2]是那个??他是左树的还是右树的还是混的?
而且就算我保留了上一层的结果,我是可以判断他在那个,但感觉逻辑会很混乱,而且遇上这种全部数值一致的感觉没法做。

但我在写这个博客时候,感觉可以将树展开成数组保存的那种方式,应该就可以了。这样就可以保证每一个nil都是正确填充。但感觉会非常占内存。。。

中序遍历

前面层级遍历不行之后,我就换了思路,感觉不是中序一下,这个树只要这个树是对称的理论上来说
[左树]中[右树]
这里的左树reverse一下会等于右树
感觉这个思路一点问题没有,直接写代码,哈哈哈又是WA

问题:
在这里插入图片描述

看这个图,你会发现这里并不对称,但左子树,右子树无论前中后序全部都一样都是[2,2]

因为
题目要求对称,本质上是要获取树的形状信息,但是你如果用了中序遍历,就会使得树的形状信息被压缩了,压缩成了序列信息。
这里是有损的。
而一个单纯的序列信息并不能准确对应一个树,因为都知道,想要还原一个树,你必须要有中序遍历和其他任何一种便利,所以你现在只有中序遍历,是不能够判断是否对称的。

同步中序

基于上面思路,我的脑子开始抽象了起来,我感觉我不能直接中序一下压缩,然后用压缩后的结果判断,那我就让左树跟右树一起同步做“中序遍历”,这样在做同步的过程之中进行判断,保证树的形状信息。
通俗一点讲就是,左树要往左边走,右树遍历也往左边走。
但是是要判断对称的,所以左树往左边走,右树就往右边走。

然后就有了以下代码

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
 
func judge(node1 *TreeNode, node2 *TreeNode) bool {
    if (node1 != nil && node2 == nil) || (node1 == nil && node2 != nil) {
        return false
    }
    return true
}
func query(node1 *TreeNode, node2 *TreeNode) bool{
    if !judge(node1, node2){
        return false
    }
    if node1 == nil{
        return true
    }

    if !query(node1.Left, node2.Right) {
        return false
    }
    if node1.Val != node2.Val{
        return false
    }
    if !query(node1.Right, node2.Left) {
        return false
    }
    return true
}

func isSymmetric(root *TreeNode) bool {
    
    // left := make([]int, 0)
    // left = midQuery(root.Left, left)
    // right := make([]int, 0)
    // right = midQuery(root.Right, right)
    // fmt.Println(left, right)
    // if len(left) != len(right){
    //     return false
    // }
    // for i := 0; i < len(left); i ++ {
    //     if left[i] != right[len(left)-1 - i] {
    //         return false
    //     }
    // }
    if !judge(root.Left, root.Right) {
        return false
    }
    
    return query(root.Left, root.Right)
}

真tmd简单啊~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GPIO在ZYNQ7000中的结构和相关寄存器解析

GPIO MASK DATA LSW和 MASK DATA MSW LSW和MSW分别是LSW (Least Significant Word)和MSW (Most Significant Word)。 因为DATA是u32,所以如果寄存器的基址是XGPIOPS_DATA_LSW_OFFSET&#xff0c;那么32位就能同时让高16位的MASK DATA MSW]31:16和 MASK DATA LSW的bit7同时为…

设计模式-装饰器模式(结构型)与责任链模式(行为型)对比,以及链式设计

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1.装饰器模式1.1概念1.2作用1.3应用场景1.4特点1.5类与对象关系1.6实现 2责任链模式2.1概念2.2作用2.3应用场景2.4特点2.5类与对象关系2.6实现 3.对比总结 前言…

TesseractOCR-GUI:基于WPF/C#构建TesseractOCR简单易用的用户界面

前言 前篇文章使用Tesseract进行图片文字识别介绍了如何安装TesseractOCR与TesseractOCR的命令行使用。但在日常使用过程中&#xff0c;命令行使用还是不太方便的&#xff0c;因此今天介绍一下如何使用WPF/C#构建TesseractOCR简单易用的用户界面。 普通用户使用 参照上一篇教…

解决 IntelliJ IDEA 启动错误:插件冲突处理

引言 在使用 IntelliJ IDEA 进行开发时&#xff0c;我们可能会遇到各种启动错误。本文将详细介绍一种常见的错误&#xff1a;插件冲突&#xff0c;并提供解决方案。 错误背景 最近&#xff0c;有用户在启动 IntelliJ IDEA 时遇到了一个错误&#xff0c;提示信息为&#xff1a…

多线程的知识总结(8):用 thread 类 或全局 async (...) 函数,创建新线程时,谁才是在新线程里第一个被执行的函数

&#xff08;40&#xff09;用 thread 类 或全局 async (…) 函数&#xff0c;创建新线程时&#xff0c;谁才是在新线程里第一个被执行的函数&#xff1f; 弄清楚这个问题&#xff0c;有利于推测和理解线程中代码的执行流程。根据 thread 类 和 async &#xff08;…&#xff0…

ChatGPT 4:解锁AI文案、绘画与视频创作新纪元

文章目录 AI文案&#xff1a;激发文字的魅力&#xff0c;重塑营销与传播AI绘画&#xff1a;解锁艺术的无限可能&#xff0c;激发创意灵感AI视频&#xff1a;重塑视频创作流程&#xff0c;提升制作效率GPTs&#xff1a;构建个性化AI应用&#xff0c;赋能各行各业《ChatGPT 4 应用…

【pyspark学习从入门到精通23】机器学习库_6

目录 分割连续变量 标准化连续变量 分类 分割连续变量 我们经常处理高度非线性的连续特征&#xff0c;而且只用一个系数很难拟合到我们的模型中。 在这种情况下&#xff0c;可能很难只通过一个系数来解释这样一个特征与目标之间的关系。有时&#xff0c;将值划分到离散的桶中…

linux 进程间通信:匿名管道pipe()

进程间内存独立且相互不可见&#xff0c;进程间通信需要特殊方法 匿名管道pipe() /* Create a one-way communication channel (pipe). If successful, two file descriptors are stored in PIPEDES; bytes written on PIPEDES[1] can be read from PIPEDES[0]. Retu…

哈默纳科Harmonic谐波减速机机器人精准高效动力传递的核心力量

在当今科技飞速发展的时代&#xff0c;机器人技术正以惊人的速度改变着我们的生产与生活方式。而在机器人的精密机械结构中&#xff0c;哈默纳科 Harmonic 谐波减速机扮演着不可或缺的角色&#xff0c;成为机器人精准高效动力传递的关键所在。 1.高精度与灵活性&#xff1a;哈默…

Codigger SIDE之Helix编辑器

在Codigger的多维世界中&#xff0c;Helix编辑器以其卓越的性能和灵活性&#xff0c;成为开发者手中的利剑。基于Rust构建&#xff0c;Helix不仅继承了Vim编辑器的经典特性&#xff0c;更以其现代化的功能&#xff0c;重新定义了代码编辑的边界。 模式切换的艺术 Helix的模式切…

Scala的正则表达式二

验证用户名是否合法 规则 1.长度在6-12之间 2.不能数字开头 3.只能包含数字&#xff0c;大小写字母&#xff0c;下划线def main(args: Array[String]): Unit {val name1 "1admin"//不合法&#xff0c;是数字开头val name2 "admin123"//合法val name3 &quo…

C++ 运算符重载 (备查)

基础 运算符重载&#xff0c;就是对已有的运算符重新进行定义&#xff0c;赋予其另一种功能&#xff0c;以适应不同的数据类型。 运算符重载也可以发生函数重载。 语法&#xff1a; void operator(); //代表了被重载的运算符。函数的参数个数取决于两个因素。1)运算符是一元(一…

zerotier实现内网穿透(访问内网服务器)

moo 内网穿透工具 实用工具&#xff1a;zerotier 目录 内网穿透工具 Windows下zerotier安装 ubuntu系统下的zerotier安装 使用moon加速 Windows下zerotier安装 有了网络之后&#xff0c;会给你一个网络id&#xff0c;这个网络id是非常重要的&#xff0c;其它设备要加入…

【C++】刷题强训(day14)--乒乓球匡、组队竞赛、删除相邻数字的最大分数

目录 1、乒乓球匡 1.1题目 1.2 思路 1.3 代码实现 2、组队竞赛 2.1 题目 2.2 思路 2.3 代码实现 3、删除相邻数字的最大分数 3.2 思路 3.3 代码实现 刷题汇总&#xff1a;传送门&#xff01; 1、乒乓球匡 1.1题目 1.2 思路 这道题注意一下示例&#xff0c;<br…

Windows安装elasticsearch、Kibana以及IK分词器

一、下载 1.下载elasticsearch 访问官网Download Elasticsearch | Elastic&#xff0c;下载elasticsearch 2.下载 Kibana 访问Download Kibana Free | Get Started Now | Elastic &#xff0c;下载 Kibana 3. IK分词器下载 访问Gitee 极速下载/elasticsearch-analysis-ik选…

STM32输入捕获详解

目录 一、引言 二、输入捕获原理 三、寄存器介绍 四、配置步骤 1.开启时钟 2.GPIO 初始化 3.初始化定时器 4.配置输入捕获模式 5.使能捕获和更新中断 6.设置中断分组并编写中断服务函数 7.使能定时器 五、程序示例 六、总结 一、引言 在嵌入式系统开发中&#xff0…

聚类及Python下实现 K-means 算法

聚类 聚类是无监督学习中的一种重要方法&#xff0c;旨在将数据集中相似的数据对象划分到同一个簇中&#xff0c;使得不同簇之间的数据对象差异尽可能大。在大数据环境下&#xff0c;聚类可以帮助挖掘数据中的隐藏结构和模式&#xff0c;应用场景十分广泛&#xff0c;比如在客…

开源分布式系统追踪-01-Zipkin-01-入门介绍

分布式跟踪系列 CAT cat monitor 分布式监控 CAT-是什么&#xff1f; cat monitor-02-分布式监控 CAT埋点 cat monitor-03-深度剖析开源分布式监控CAT cat monitor-04-cat 服务端部署实战 cat monitor-05-cat 客户端集成实战 cat monitor-06-cat 消息存储 skywalking …

解决Jmeter HTTP Cookie管理器cookie不生效

解决Jmeter HTTP Cookie管理器cookie不生效问题 解决Jmeter HTTP Cookie管理器cookie不生效问题1、设置Jmeter HTTP Cookie管理器cookie后&#xff0c;发起的请求显示[no cookies]jmeter问题复现&#xff1a;这里同样使用postman进行重试&#xff0c;发现是可以正常获取数据的&…

【6】数据分析检测(DataFrame 1)

学习目标3 昨天&#xff0c;我们学习了Series。 而Pandas的另一种数据类型&#xff1a;DataFrame&#xff0c;在许多特性上和Series有相似之处。 今天&#xff0c;我们将学习DataFrame的相关知识&#xff1a; 1. DataFrame的概念 2. 构造一个DataFrame 3. DataFrame的常用…