当前位置: 首页 > news >正文

【LeetCode】101. 对称二叉树

101. 对称二叉树

难度:简单

题目

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

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

个人题解

方法一:递归-深度优先遍历

写了 100 题后再写这题,信手捏来。先判断当前节点是否为空。再判断当前节点的左节点和右节点是否相等。再看左左节点与右右节点,再比较左右节点与右左节点。

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public boolean isSymmetric(TreeNode root) {if (root == null) {return true;}return process(root.left, root.right);}public boolean process(TreeNode left, TreeNode right) {if (left == null && right == null) {return true;}if (left == null ^ right == null) {return false;}if (left.val != right.val) {return false;}if (!process(left.left, right.right)) {return false;}return process(left.right, right.left);}
}

官方题解

方法一:递归

如果一个树的左子树与右子树镜像对称,那么这个树是对称的。因此,该问题可以转化为:两个树在什么情况下互为镜像?

如果同时满足下面的条件,两个树互为镜像:

  • 它们的两个根结点具有相同的值
  • 每个树的右子树都与另一个树的左子树镜像对称

我们可以实现这样一个递归函数,通过「同步移动」两个指针的方法来遍历这棵树,p 指针和 q 指针一开始都指向这棵树的根,随后 p 右移时,q 左移,p 左移时,q 右移。每次检查当前 p 和 q 节点的值是否相等,如果相等再判断左右子树是否对称。

class Solution {public boolean isSymmetric(TreeNode root) {return check(root, root);}public boolean check(TreeNode p, TreeNode q) {if (p == null && q == null) {return true;}if (p == null || q == null) {return false;}return p.val == q.val && check(p.left, q.right) && check(p.right, q.left);}
}

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

方法二:迭代

「方法一」中我们用递归的方法实现了对称性的判断,那么如何用迭代的方法实现呢?首先我们引入一个队列,这是把递归程序改写成迭代程序的常用方法。初始化时我们把根节点入队两次。每次提取两个结点并比较它们的值(队列中每两个连续的结点应该是相等的,而且它们的子树互为镜像),然后将两个结点的左右子结点按相反的顺序插入队列中。当队列为空时,或者我们检测到树不对称(即从队列中取出两个不相等的连续结点)时,该算法结束。

class Solution {public boolean isSymmetric(TreeNode root) {return check(root, root);}public boolean check(TreeNode u, TreeNode v) {Queue<TreeNode> q = new LinkedList<TreeNode>();q.offer(u);q.offer(v);while (!q.isEmpty()) {u = q.poll();v = q.poll();if (u == null && v == null) {continue;}if ((u == null || v == null) || (u.val != v.val)) {return false;}q.offer(u.left);q.offer(v.right);q.offer(u.right);q.offer(v.left);}return true;}
}

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

作者:力扣官方题解
链接:https://leetcode.cn/problems/symmetric-tree/solutions/268109/dui-cheng-er-cha-shu-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

http://www.lryc.cn/news/248050.html

相关文章:

  • O-Star|再相识
  • 最新PHP熊猫头图片表情斗图生成源码
  • 子虔科技出席2023WAIC“智能制造融合创新论坛”
  • 递归算法学习——二叉树的伪回文路径
  • Android端极致画质体验之HDR播放
  • 【Java SE】带你在String类世界中遨游!!!
  • Android: ListView + ArrayAdapter 简单应用
  • 前端:实现二级菜单(点击实现二级菜单展开)
  • Spark-java版
  • RabbitMQ消息模型之Work Queues
  • vue3+ts 实现时间间隔选择器
  • PTA 魔法优惠券
  • P8A110-A120经典赛题
  • 文件基础知识
  • 二叉树OJ题之二
  • MySql表中添加emoji表情
  • 【新手解答1】深入探索 C 语言:变量名、形参 + 主调函数、被调函数 + 类和对象 + 源文件(.c 文件)、头文件(.h 文件)+ 库
  • 2023最新的软件测试热点面试题(答案+解析)
  • NCo3.1(08) - Nco3 服务器端编程
  • 【代码随想录】算法训练计划36
  • Python (十五) 面向对象之多继承问题
  • 广域网加速技术
  • 构建智能医患沟通:陪诊小程序开发实战
  • 插入区间[中等]
  • Android Bitmap 模糊效果实现 (二)
  • 初识Java 18-4 泛型
  • 家政保洁预约小程序app开发特点有哪些?
  • 【JavaEE初阶】 HTTP响应报文
  • PTA: 螺旋矩阵
  • SparkSQL远程调试(IDEA)