【算法题解】36. 对称二叉树的递归解法

news/2024/11/29 4:52:06/

这是一道 简单
https://leetcode.cn/problems/symmetric-tree/

题目

给你一个二叉树的根节点 root , 检查它是否轴对称。

示例 1:
对称二叉树的递归解法

输入:root = [1,2,2,3,4,4,3]
输出:true

示例 2:
对称二叉树的递归解法

输入:root = [1,2,2,null,3,null,3]
输出:false

提示:

  • 树中节点数目在范围 [ 1 , 1000 ] [1, 1000] [1,1000]
  • − 100 < = N o d e . v a l < = 100 -100 <= Node.val <= 100 100<=Node.val<=100

题解

判断是否是对称二叉树,需要满足其 左子树右子树 是对称的。

那么如何判断左右子树是对称的呢?
i余数-对称二叉树的递归解法

通过上图示例,我们可以分析出左右子树对称需要满足以下 3 个条件:

  1. 左右子树根节点的值必须相等。如图所示左右子树的根节点都是 2
  2. 左子树的左子树右子树的右子树 必须对称。图中的绿色虚线框起来的部分。
  3. 左子树的右子树右子树的左子树 必须对称。图中的紫色虚线框起来的部分。

我们发现,判断两个树是否对称,其最终结果依赖另外的两组(条件23)的两个树是否对称,这就是典型的递归的思路,其中:

递归函数:判断两个二叉树是否对称。

边界条件:两个二叉树中任意一个为空,就可以返回。如果两个都为空返回 true,否则就是一个为空而另一个不为空返回 false

Java 代码实现

/*** 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 isSymmetric(root.left, root.right);}private boolean isSymmetric(TreeNode left, TreeNode right){if(left == null && right == null){return true;}else if(left == null || right == null){return false;}return left.val == right.val && isSymmetric(left.left, right.right) && isSymmetric(left.right, right.left);}
}

Go 代码实现

/*** Definition for a binary tree node.* type TreeNode struct {*     Val int*     Left *TreeNode*     Right *TreeNode* }*/
func isSymmetric(root *TreeNode) bool {if root == nil {return true}return isSymmetric2(root.Left, root.Right)
}func isSymmetric2(left *TreeNode, right *TreeNode) bool {if left == nil && right == nil {return true}else if left == nil || right == nil {return false}return left.Val == right.Val && isSymmetric2(left.Right, right.Left) && isSymmetric2(left.Left, right.Right)
}

复杂度分析

时间复杂度: O ( N ) O(N) O(N)N 为二叉树中的节点个数。每个节点都需要计算一次,总计是 N 次。

空间复杂度: O ( N ) O(N) O(N)。空间复杂度取决于调用栈的深度,最差为 N


http://www.ppmy.cn/news/285230.html

相关文章

Nacos架构与原理 - 总体架构

文章目录 Nacos 起源Nacos 定位Nacos 优势Nacos 生态Nacos 总体设计设计原则架构图用户层业务层内核层插件 小结 Nacos 起源 Nacos 在阿里巴巴起源于 2008 年五彩石项目&#xff08;完成微服务拆分和业务中台建设&#xff09;&#xff0c;成长于十年双十⼀的洪峰考验&#xff…

MySQL的下载安装以及环境配置---图文教程

目录 一.下载 二.安装 三.设置环境变量 四.MySQL数据库的使用及注意事项 SQL语句注意事项 一.下载 1.打开 MySQL 数据库的网站。 2.往下滑 3.进入新的页面之后&#xff0c;点击 MySQL Installer for Windows 4.进入新的页面时&#xff0c;就可以下载MySQL数据库了&#x…

重启 mysql_重启MySQL的正确方法

修改了my.cnf&#xff0c;需要重启MySQL服务 由于是从源码包安装的Mysql&#xff0c;所以系统中是没有红帽常用的servcie mysqld restart这个脚本 只好手工重启 有人建议Killall mysql。这种野蛮的方法其实是不行的&#xff0c;强制终止的话&#xff0c;如果造成表损坏&#xf…

linux重启websphere服务,Linux环境下Websphere重启

一、Websphere控制台重启 1、更新class文件发布&#xff0c;Websphere自动重启。 2、更新web.xml发布&#xff0c;需要手动更新web.xml或者更新项目。 web.config 缓存位置&#xff1a; WebSphere/AppServer/profiles/AppSrvDC/config/cells/dcapp02Cell01/applications/项目/d…

centos7系统关机命令_centos关机与重启命令

Linux centos重启命令: 1、reboot 普通重启 2、shutdown -r now 立刻重启(root用户使用) 3、shutdown -r 10 过10分钟自动重启(root用户使用) 4、shutdown -r 20:35 在时间为20:35时候重启(root用户使用) 如果是通过shutdown命令设置重启的话,可以用shutdown -c命令取消重启…

python强制终止_python强制终止

广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 方法1:采用sys.exit(0)正常终止程序,从图中可以看到,程序终止后shell运行不受影响。 ?方法2:采用os._exit(0)关闭整个shell,从图中看到, 调用sys._exit(0…

linux强制重启 mysql_LINUX启动/重启/停上MYSQL的命令(详解)

如何启动/停止/重启MySQL 一、启动方式 1、使用 service 启动:service mysqld start 2、使用 mysqld 脚本启动:/etc/inint.d/mysqld start 3、使用 safe_mysqld 启动:safe_mysqld& 二、停止 1、使用 service 启动:service mysqld stop 2、使用 mysqld 脚本启动:/etc/i…

ipmi重启_Linux下使用IPMItool重启IPMI的方法

1.安装IPMItool工具 # yum install ipmitool 2.检测IPMI组件 # dmidecode |sed -n /IPMI/,5p 出现以下信息&#xff0c;说明支持IPMI IPMI Device Information Interface Type: KCS (Keyboard Control Style) Specification Version: 2.0 I2C Slave Address: 0x00 NV Storage D…