28. 对称的二叉树
链接
https://leetcode-cn.com/problems/dui-cheng-de-er-cha-shu-lcof/
难度: #简单
题目
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
1/ \2 2/ \ / \
3 4 4 3
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
1/ \2 2\ \3 3
示例 1:
输入:root = [1,2,2,3,4,4,3]
输出:true
示例 2:
输入:root = [1,2,2,null,3,null,3]
输出:false
限制:0 <= 节点个数 <= 1000
注意:本题与主站 101 题相同:https://leetcode-cn.com/problems/symmetric-tree/
代码框架
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val = x; }* }*/
class Solution {public boolean isSymmetric(TreeNode root) {}
}
题目解析
二叉树是否对称,
就是查看每一层的节点是否对称,
就是从每一层的左右两边开始,
这两个节点相等,
两个节点的比较过程中,
存在如下的4种基本情况:
序号 | left | right | compare |
---|---|---|---|
1 | null | null | true |
2 | null | right | false |
3 | left | null | false |
4 | left | right | left.val==right.val |
解答思路1:
迭代解法,
使用双端队列作为辅助,
按层遍历二叉树,
为了保证二叉树对称,
校验队列中保存每层的节点,
从左右两端的节点开始比较,
保证节点两两相同。
解答思路2:
迭代解法,
使用ArryList作为辅助,
按层遍历二叉树,
为了保证二叉树对称,
校验队列中保存每层的节点,
从左右两端的节点开始比较,
保证节点两两相同。
解答思路3:
递归解法,
比较两个二叉树是否对称,
如果相等,
继续比较其子节点是否对称。
3种解答思路中,
递归解法是最快的0ms,
迭代解法使用ArrayList是1ms,
迭代解法使用队列是最慢的2ms。
测试用例
package edu.yuwen.sowrd.num28.solution;import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;import edu.yuwen.sowrd.entity.TreeNode;
import edu.yuwen.sowrd.num28.sol3.Solution;public class SolutionTest {/*** 二叉树是对称的:* 1* / \* 2 2* / \ / \*3 4 4 3*/@Testpublic void testCase1() {Solution solution = new Solution();TreeNode node1 = new TreeNode(1);TreeNode node2 = new TreeNode(2);TreeNode node3 = new TreeNode(2);TreeNode node4 = new TreeNode(3);TreeNode node5 = new TreeNode(4);TreeNode node6 = new TreeNode(4);TreeNode node7 = new TreeNode(3);node1.left = node2;node1.right = node3;node2.left = node4;node2.right = node5;node3.left = node6;node3.right = node7;TreeNode root = node1;boolean res = solution.isSymmetric(root);Assertions.assertTrue(res);}/*** 二叉树不是对称的:* 1* / \* 2 2* \ \* 3 3*/@Testpublic void testCase2() {Solution solution = new Solution();TreeNode node1 = new TreeNode(1);TreeNode node2 = new TreeNode(2);TreeNode node3 = new TreeNode(2);TreeNode node5 = new TreeNode(3);TreeNode node7 = new TreeNode(3);node1.left = node2;node1.right = node3;node2.right = node5;node3.right = node7;TreeNode root = node1;boolean res = solution.isSymmetric(root);Assertions.assertFalse(res);}/*** 二叉树是不对称的:* 2* / \* 3 3* / \ \*4 5 4*/@Testpublic void testCase3() {Solution solution = new Solution();TreeNode node1 = new TreeNode(2);TreeNode node2 = new TreeNode(3);TreeNode node3 = new TreeNode(3);TreeNode node4 = new TreeNode(4);TreeNode node5 = new TreeNode(5);TreeNode node6 = null;TreeNode node7 = new TreeNode(4);node1.left = node2;node1.right = node3;node2.left = node4;node2.right = node5;node3.left = node6;node3.right = node7;TreeNode root = node1;boolean res = solution.isSymmetric(root);Assertions.assertFalse(res);}
}
解答1
package edu.yuwen.sowrd.num28.sol1;import java.util.Deque;
import java.util.LinkedList;
import java.util.List;import edu.yuwen.sowrd.entity.TreeNode;public class Solution {public boolean isSymmetric(TreeNode root) {if (root == null) {return true;}// 双端队列,用于比较两端的元素Deque<TreeNode> dq = new LinkedList<>();dq.offer(root.left);dq.offer(root.right);while (!dq.isEmpty()) {int size = dq.size();// List集合,用于保存当前层的元素List<TreeNode> list = new LinkedList<>();list.addAll(dq);// 校验左右两端开始的元素是否相同for (int i = 0; i < size / 2; i++) {TreeNode left = dq.pollFirst();TreeNode right = dq.pollLast();boolean res = true;// 两个节点都不为null,则比较值是否相等// 考虑null的情况,有一个不为null则必不对称if (left != null && right != null) {res = left.val == right.val;} else if (left != null && right == null) {res = false;} else if (left == null && right != null) {res = false;}// 校验发现不对称if (!res) {return false;}}// 保存当前层的下一层节点for (TreeNode node : list) {if (node == null) {continue;}dq.offer(node.left);dq.offer(node.right);}}// 最终确认二叉树是对称的return true;}
}
解答2
package edu.yuwen.sowrd.num28.sol2;import java.util.ArrayList;
import java.util.List;import edu.yuwen.sowrd.entity.TreeNode;public class Solution {public boolean isSymmetric(TreeNode root) {if (root == null) {return true;}List<TreeNode> nodes = new ArrayList<>();nodes.add(root.left);nodes.add(root.right);while (!nodes.isEmpty()) {int size = nodes.size();// 校验左右两端开始的元素是否相同for (int i = 0; i < size / 2; i++) {TreeNode left = nodes.get(i);TreeNode right = nodes.get(size - 1 - i);// 两个节点都不为null,则比较值是否相等// 考虑null的情况,有一个不为null则必不对称if (left != null && right != null) {boolean res = left.val == right.val;// 校验发现不对称if (!res) {return false;}} else if (left != null && right == null) {return false;} else if (left == null && right != null) {return false;}}// 获取当前层的下一层List<TreeNode> news = new ArrayList<>();for (TreeNode node : nodes) {if (node == null) {continue;}news.add(node.left);news.add(node.right);}nodes = news;}// 最终确认二叉树是对称的return true;}
}
解答3 推荐
package edu.yuwen.sowrd.num28.sol3;import edu.yuwen.sowrd.entity.TreeNode;public class Solution {public boolean isSymmetric(TreeNode root) {if (root == null) {return true;}return compare(root.left, root.right);}/*** 比较两个二叉树是否对称,* 如果对称继续比较其子节点*/private boolean compare(TreeNode left, TreeNode right) {// 两个节点都为null,则一定对称// 考虑null的情况,有一个不为null则必不对称if (left == null && right == null) {return true;} else if (left != null && right == null) {return false;} else if (left == null && right != null) {return false;}// 校验发现不对称立即返回,否则继续比较if (left.val != right.val) {return false;}/*** 上面的分支判断可以进一步优化:* else if (left == null || right == null || left.val != right.val) {* return false;* }*/// 继续比较子节点是否对称,都对称才能确认是对称的return compare(left.left, right.right)&& compare(left.right, right.left);}
}
http://www.taodudu.cc/news/show-1250924.html
相关文章:
- 解决tomcat的undeploy
- 解决eclipse出现The superclass javax.servlet.http.HttpServlet was not found on the Java Build Path
- 下载安装neo4j
- vue-drag-resize实线页面的拖拽与缩放
- 解决IDEA不能编译XML文件
- 播放视频和音频文件java
- 实时获取屏幕大小
- vue部分样式无法修改
- vue中根据搜索内容跳转到页面指定位置
- Duplicate entry ‘‘ for key ‘***‘
- transferto遇到的问题java.io.FileNotFoundException: C:\Users\Administrator\AppData\Local\Temp
- Spring的jar包下载
- *** is required and cannot be removed from the server
- Tomcat 服务器介绍和使用
- 第一个 Web 程序
- Servlet 介绍
- 集成 Tomcat、 Servlet 的生命周期
- Request 对象、重定向、请求转发
- Cookie 学习
- ServletContext对象、ServletConfig对象
- sevlet中web.xml 文件
- 过滤器、监听器
- El 表达式、jstl学习
- cookie与session详解、url地址重写
- 命名规范、MVC 开发模式
- MyBatis 简介、 环境搭建、数据库连接池、查询方式
- 注解、路径、 Log4J、<settings>标签
- parameterType 属性、typeAliases 别名
- MyBatis 实现增删CRUD
- MyBatis 接口绑定方案及多参数传递、动态 SQL、ThreadLocal、缓存
28. 对称的二叉树相关推荐
- 《LeetCode力扣练习》剑指 Offer 28. 对称的二叉树 Java
<LeetCode力扣练习>剑指 Offer 28. 对称的二叉树 Java 一.资源 题目: 请实现一个函数,用来判断一棵二叉树是不是对称的.如果一棵二叉树和它的镜像一样,那么它是对称的 ...
- LeetCode-剑指 Offer 28. 对称的二叉树
剑指 Offer 28. 对称的二叉树 对称二叉树定义:对于树中任意两个对称节点L和R,一定有: L.val == R.val:这两个对称节点值相等 L.left.val == R.right.val ...
- LeetCode Algorithm 剑指 Offer 28. 对称的二叉树
剑指 Offer 28. 对称的二叉树 Ideas 一开始想的有问题,看了例子以为对称二叉树的中序遍历序列是回文数组,然后就用这么写了,结果到第192个测试用例[1,2,2,2,null,2]就失败了 ...
- 【LeetCode】剑指 Offer 28. 对称的二叉树
[LeetCode]剑指 Offer 28. 对称的二叉树 文章目录 [LeetCode]剑指 Offer 28. 对称的二叉树 一.递归 一.递归 对称二叉树定义:对于书中任意两个对称结点 L 和 ...
- 剑指 Offer 28. 对称的二叉树 -- 递归
0 题目描述 leetcode原题链接:剑指 Offer 28. 对称的二叉树 1 递归解法 对称二叉树定义: 对于树中 任意两个对称节点 LLL 和 R,R,R, 一定有: L.val=R.val: ...
- 剑指offer:面试题28. 对称的二叉树
题目:对称的二叉树 请实现一个函数,用来判断一棵二叉树是不是对称的.如果一棵二叉树和它的镜像一样,那么它是对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1 / \ 2 ...
- 【Java】 剑指offer(28) 对称的二叉树
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 请实现一个函数,用来判断一棵二叉树是不是对称的.如果一棵二叉树和它 ...
- 剑指 Offer 28. 对称的二叉树【无取巧,易于理解!】
看题解时,很多大牛用很少的代码就完成了AC,但可能看了很多遍也看不懂,因此萌生了写一种最"笨"最完整的代码的想法,这样大家可以通过我的代码入门,看懂了再去挑战大牛们的简洁解法. 请 ...
- 剑指offer面试题28. 对称的二叉树(递归)
题目描述 请实现一个函数,用来判断一棵二叉树是不是对称的.如果一棵二叉树和它的镜像一样,那么它是对称的. 思路 详见链接 代码 class Solution:def isSymmetric(self, ...
最新文章
- 记录一次java项目上线部署
- nova resize代码调用部分分析
- Spring源码-AOP(六)-自动代理与DefaultAdvisorAutoProxyCreator
- ios 获取视频截图
- flask创建mysql表_MySQL表不是使用Flask和PyMySQL创建的
- python3.6入门到高阶(全栈) day015 初识面向对象
- 算法---宝藏最优选择问题
- 便宜的手机图传遥控模块
- java8 stream index_Java8的stream用法整理
- PHP 与go 通讯,Golang和php通信
- 详述白盒测试的逻辑覆盖的路径覆盖及其优缺点
- Linux安装weblogic报错“u01/app/oraInventory/“ cannot read/execute
- 2022 开源之夏 | Serverless Devs 陪你“变得更强”
- mysql中的comment_请问一下在mysql中的 COMMENT 有什么作用吗??
- android手机获取手机设备信息
- springboot项目有哪几种运行方式
- MySQL5.7卸载不干净,残留文件MySQL connector net 8.0.12
- Django和Vue搭建前后端分离框架
- ff14显卡测试软件,最终幻想14首台4K电脑环境搭建测试实录
- 大数据时代如何使用数据分析来找女朋友?
热门文章
- 非常不错的一些前端动态效果【收集】
- #ifndef HeaderName_h #define HeaderName_h #endif 使用详解
- 绝对定位的div的居中方法,下面的写法兼容IE系列浏览器和火狐浏览器。
- 初识 Oracle 11g
- 用 less 自制 bs 栅格布局
- [jQuery基础] jQuery对象 -- 属性操作
- Python_Socket实现简单的ssh/ftp
- 如何获取cookie值
- margin-top失效的解决办法
- 简单粗糙的指尖检测方法(FingerTips Detection)