链接

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. 对称的二叉树相关推荐

  1. 《LeetCode力扣练习》剑指 Offer 28. 对称的二叉树 Java

    <LeetCode力扣练习>剑指 Offer 28. 对称的二叉树 Java 一.资源 题目: 请实现一个函数,用来判断一棵二叉树是不是对称的.如果一棵二叉树和它的镜像一样,那么它是对称的 ...

  2. LeetCode-剑指 Offer 28. 对称的二叉树

    剑指 Offer 28. 对称的二叉树 对称二叉树定义:对于树中任意两个对称节点L和R,一定有: L.val == R.val:这两个对称节点值相等 L.left.val == R.right.val ...

  3. LeetCode Algorithm 剑指 Offer 28. 对称的二叉树

    剑指 Offer 28. 对称的二叉树 Ideas 一开始想的有问题,看了例子以为对称二叉树的中序遍历序列是回文数组,然后就用这么写了,结果到第192个测试用例[1,2,2,2,null,2]就失败了 ...

  4. 【LeetCode】剑指 Offer 28. 对称的二叉树

    [LeetCode]剑指 Offer 28. 对称的二叉树 文章目录 [LeetCode]剑指 Offer 28. 对称的二叉树 一.递归 一.递归 对称二叉树定义:对于书中任意两个对称结点 L 和 ...

  5. 剑指 Offer 28. 对称的二叉树 -- 递归

    0 题目描述 leetcode原题链接:剑指 Offer 28. 对称的二叉树 1 递归解法 对称二叉树定义: 对于树中 任意两个对称节点 LLL 和 R,R,R, 一定有: L.val=R.val: ...

  6. 剑指offer:面试题28. 对称的二叉树

    题目:对称的二叉树 请实现一个函数,用来判断一棵二叉树是不是对称的.如果一棵二叉树和它的镜像一样,那么它是对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1    / \   2 ...

  7. 【Java】 剑指offer(28) 对称的二叉树

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 请实现一个函数,用来判断一棵二叉树是不是对称的.如果一棵二叉树和它 ...

  8. 剑指 Offer 28. 对称的二叉树【无取巧,易于理解!】

    看题解时,很多大牛用很少的代码就完成了AC,但可能看了很多遍也看不懂,因此萌生了写一种最"笨"最完整的代码的想法,这样大家可以通过我的代码入门,看懂了再去挑战大牛们的简洁解法. 请 ...

  9. 剑指offer面试题28. 对称的二叉树(递归)

    题目描述 请实现一个函数,用来判断一棵二叉树是不是对称的.如果一棵二叉树和它的镜像一样,那么它是对称的. 思路 详见链接 代码 class Solution:def isSymmetric(self, ...

最新文章

  1. 记录一次java项目上线部署
  2. nova resize代码调用部分分析
  3. Spring源码-AOP(六)-自动代理与DefaultAdvisorAutoProxyCreator
  4. ios 获取视频截图
  5. flask创建mysql表_MySQL表不是使用Flask和PyMySQL创建的
  6. python3.6入门到高阶(全栈) day015 初识面向对象
  7. 算法---宝藏最优选择问题
  8. 便宜的手机图传遥控模块
  9. java8 stream index_Java8的stream用法整理
  10. PHP 与go 通讯,Golang和php通信
  11. 详述白盒测试的逻辑覆盖的路径覆盖及其优缺点
  12. Linux安装weblogic报错“u01/app/oraInventory/“ cannot read/execute
  13. 2022 开源之夏 | Serverless Devs 陪你“变得更强”
  14. mysql中的comment_请问一下在mysql中的 COMMENT 有什么作用吗??
  15. android手机获取手机设备信息
  16. springboot项目有哪几种运行方式
  17. MySQL5.7卸载不干净,残留文件MySQL connector net 8.0.12
  18. Django和Vue搭建前后端分离框架
  19. ff14显卡测试软件,最终幻想14首台4K电脑环境搭建测试实录
  20. 大数据时代如何使用数据分析来找女朋友?

热门文章

  1. 非常不错的一些前端动态效果【收集】
  2. #ifndef HeaderName_h #define HeaderName_h #endif 使用详解
  3. 绝对定位的div的居中方法,下面的写法兼容IE系列浏览器和火狐浏览器。
  4. 初识 Oracle 11g
  5. 用 less 自制 bs 栅格布局
  6. [jQuery基础] jQuery对象 -- 属性操作
  7. Python_Socket实现简单的ssh/ftp
  8. 如何获取cookie值
  9. margin-top失效的解决办法
  10. 简单粗糙的指尖检测方法(FingerTips Detection)