力扣101 对称二叉树 Java版本

文章目录

  • 题目描述
  • 递归解法
  • 非递归解法


题目描述

给你一个二叉树的根节点 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

进阶:你可以运用递归和迭代两种方法解决这个问题吗?

递归解法

class Solution {public boolean isSymmetric(TreeNode root) {if (root==null){return true;}return judgeIsSymmetric(root.left,root.right);}public boolean judgeIsSymmetric(TreeNode leftChild,TreeNode rightChild){//这种情况是递归出口,当左右孩子都为空的时候就不需要向下判断了,直接返回trueif (leftChild==null&&rightChild==null){return true;}//下面这三种情况都是不满足的时候,都需要返回falseif(leftChild==null&&rightChild!=null){return false;}if (leftChild!=null&&rightChild==null){return false;}if (leftChild.val!= rightChild.val){return false;}//继续往下递归判断,判断左孩子的左孩子和右孩子的右孩子是否对称,判断左孩子的右孩子和右孩子的左孩子是否对称return judgeIsSymmetric(leftChild.left,rightChild.right)&&judgeIsSymmetric(leftChild.right,rightChild.left);}
}

非递归解法

思路在代码中详细注释了

class Solution {public boolean isSymmetric(TreeNode root) {//使用非递归的方式解决//利用栈来实现,有种消消乐的感觉,依次把对称的两个元素入栈,如果弹出的两个元素不相同则证明不是对称,相同则继续判断if (root == null) {return true;}Stack<TreeNode> stack = new Stack<>();stack.push(root.left);stack.push(root.right);while (!stack.isEmpty()) {TreeNode rightChild = stack.pop();TreeNode leftChild = stack.pop();//如果左右孩子中有一个不是null但是另一个是null,则肯定不对称if ((leftChild == null && rightChild != null)||(leftChild!=null&&rightChild==null)) {return false;}if (leftChild != null && rightChild != null) {//值不相等也肯定不对称if (leftChild.val != rightChild.val) {return false;}//其他情况就继续探索//再把对称的元素依次压入其中stack.push(leftChild.left);stack.push(rightChild.right);stack.push(leftChild.right);stack.push(rightChild.left);}}//都遍历完了之后则表明对称return true;}
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

提升网络质量:UDPspeeder 实现网络优化与提速

提升网络质量&#xff1a;UDPspeeder 实现网络优化与提速 背景与意义原理与功能使用方法未来展望相关链接服务 在当今高度互联的网络环境下&#xff0c;网络质量的优化和提速对于用户体验至关重要。针对高延迟和丢包率较高的网络链路&#xff0c;UDPspeeder 提供了一种前向纠错…

7 数据迁移至达梦数据库

无论使用哪种解决方案很大可能性都需要进行数据迁移&#xff0c;即将旧的非 达梦数据库的数据迁移到达梦数据库。 我们要把 Nacos 的数据或者 SQL 语句迁移到达梦数据库。借助 DM 数据迁移工具 &#xff0c;完成 Nacos 配置数据表迁移到达梦数据库。

Java里常用的集合哪些是线程安全的和不安全的

最近在做一个业务的时候&#xff0c;需要考虑线程的安全性&#xff0c;然后选用集合的时候专门去整理了一下。 线程安全的是: Hashtable&#xff0c;ConcurrentHashMap&#xff0c;Vector &#xff0c;CopyOnWriteArrayList &#xff0c;CopyOnWriteArraySet 线程不安全的是: H…

鸿蒙会成为安卓的终结者吗?

随着近期鸿蒙OS系统推送测试版的时间确定&#xff0c;关于鸿蒙系统的讨论再次升温。 作为华为自主研发的操作系统&#xff0c;鸿蒙给人的第一印象是具有颠覆性。 早在几年前&#xff0c;业内就开始流传鸿蒙可能会代替Android的传言。毕竟&#xff0c;Android作为开源系统&…

【数据分析之Numpy基础002】如何访问与修改ndarray对象

ndarray对象的访问与修改十分容易&#xff0c;跟list对象的操作一样&#xff0c;直接通过索引或切片操作就可以实现。 ndarray数组的下标也是从0开始&#xff0c;因此可以设置start&#xff0c;stop以及step参数即可从原数组中切割出一个新的数组。 例&#xff1a; 一维数组的…

Linux网络编程套接字

目录 前言 一、预备知识 1.1 源IP地址和目的IP地址 1.2 区分端口号和进程ID 1.3 TCP协议和UDP协议 1.4 网络字节序 二、socket编程接口 2.1 socket套接字的概念 2.2 socket常见API 2.3 sockaddr结构 三、关于IP和Port的绑定问题 四、编写简单的UDP服务端和客户端 前…

在VSCode中新配置一个ros项目

如何从零开始配置一个ros项目 预先准备初始化ros工程运行hello_ros进行第一个示例进行编译测试 预先准备 首先要在vscode中安装&#xff08;必须安装的&#xff09;&#xff1a;ros&#xff0c;c&#xff0c;cmake&#xff0c;cmake tools&#xff08;补全camkelist文件&#…

nginx优化配置

一 全局配置的六个模块简介 全局块&#xff1a;全局配置&#xff0c;对全局生效 events块&#xff1a;配置影响 Nginx 服务器与用户的网络连接 http块&#xff1a;配置代理&#xff0c;缓存&#xff0c;日志定义等绝大多数功能和第三方模块的配置 server块&#xff1a;配置…

交换瓶子【第七届】【省赛】【A组】

题目描述 有N个瓶子&#xff0c;编号 1 ~ N&#xff0c;放在架子上。 比如有5个瓶子&#xff1a; 2 1 3 5 4 要求每次拿起2个瓶子&#xff0c;交换它们的位置。 经过若干次后&#xff0c;使得瓶子的序号为&#xff1a; 1 2 3 4 5 对于这么简单的情况&#xff0c;显然&#…

Google插件Sider: ChatGPT Sidebar + GPTs GPT-4 Turbo Sider

Sider: ChatGPT Sidebar 可以使得满屏都是机器人&#xff0c;左侧栏可以打开访问GPT-4. 配置跳板机地址 google 搜索的右侧也有打开

ElasticSearch聚合操作

目录 ElasticSearch聚合操作 基本语法 聚合的分类 后续示例数据 Metric Aggregation Bucket Aggregation ES聚合分析不精准原因分析 提高聚合精确度 ElasticSearch聚合操作 Elasticsearch除搜索以外&#xff0c;提供了针对ES 数据进行统计分析的功能。聚合(aggregation…

Day32 文件属性 目录操作 库

文章目录 获取文件属性1.stat函数2.获取文件属性3.获取文件权限4.stat/fstat/lstat的区别&#xff1f; 目录操作库 Lib1.库的定义2.库的分类2.1 静态库2.2 动态库 3.静态库的制作4.动态库制作5.总结静态库和动态库 获取文件属性 1.stat函数 int stat(const char *path, struc…