leetcode刷题101 对称二叉树 Symmetric Tree(简单) Python Java

2024-01-27 00:08

本文主要是介绍leetcode刷题101 对称二叉树 Symmetric Tree(简单) Python Java,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目大意:

给定一个二叉树,检查它是否是镜像对称的。

例如,二叉树 [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

说明:

如果你可以运用递归和迭代两种方法解决这个问题,会很加分。

解法一:递归

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = Noneclass Solution(object):def isSymmetric(self, root):""":type root: TreeNode:rtype: bool"""if not root:                                 # 先判断根节点是否为空return Truereturn self.isMirror(root.left, root.right)  # 分成左子树和右子树判断def isMirror(self, p, q):                        # 判断两棵树是否是镜像树if not p and not q:                          # 根节点都为空,是return Trueif not p or not q:                           # 其中有一棵为空,不是return Falsel = self.isMirror(p.left, q.right)           # p的左子树和q的右子树是否相同r = self.isMirror(p.right, q.left)           # p的右子树和q的左子树是否相同return p.val == q.val and l and r            # 值相等,并且p的左=q的右,p的右=q的左

解法二:使用队列

class Solution:def isSymmetric(self, root):"""队列:param root::return:"""if not root:return Truenode_queue = [root.left, root.right]  # 在空队列中加入左子树和右子树while node_queue:left = node_queue.pop(0)          # 依次弹出两个元素right = node_queue.pop(0)if not right and not left:        # 如果均为空,继续下一个循环continueif not right or not left:         # 如果只有一个为空,返回Falsereturn Falseif left.val != right.val:         # 都非空,再判断值是否相等return Falsenode_queue.append(left.left)      # 将两个左右子树的左右子树逆序加入队列node_queue.append(right.right)node_queue.append(left.right)node_queue.append(right.left)#node_queue.extend([left.left, right.right, left.right, right.left])   或者用这一句话写return True

 

以下是Java版本:

最简单的思路就是先从左子树然后右子树遍历,记录遍历结果,然后再右子树左子树遍历,记录遍历结果,然后对比

两个遍历结果,看是否相等。

1.	public class Solution {  
2.	    public boolean isSymmetric(TreeNode root) {  
3.	        if(root == null)  
4.	            return true;  
5.	        StringBuilder builderOfLeft = new StringBuilder();  
6.	        StringBuilder builderOfRight = new StringBuilder();  
7.	        String traverseLeft = traverseLeft(root,builderOfLeft);  
8.	        String traverseRight = traverseRight(root,builderOfRight);  
9.	        if(traverseLeft.equals(traverseRight)){  
10.	            return true;  
11.	        }  
12.	        return false;  
13.	    }  
14.	    public static String traverseLeft(TreeNode root,StringBuilder builder){  
15.	        if(root == null){  
16.	            builder.append("null");  
17.	            return null;  
18.	        }  
19.	        builder.append(root.val+"");  
20.	        traverseLeft(root.left,builder);  
21.	        traverseLeft(root.right,builder);  
22.	        return builder.toString();  
23.	    }  
24.	    public static String traverseRight(TreeNode root,StringBuilder builder){  
25.	        if(root == null){  
26.	            builder.append("null");  
27.	            return null;  
28.	        }             
29.	        builder.append(root.val+"");  
30.	        traverseRight(root.right,builder);  
31.	        traverseRight(root.left,builder);   
32.	        return builder.toString();  
33.	    }  
34.	}  

用递归:

1.	public class Solution {  
2.	    public boolean isSymmetric(TreeNode root) {  
3.	        if (root == null) {  
4.	            return true;  
5.	        }  
6.	        return isSymmetric(root.left, root.right);  
7.	    }  
8.	      
9.	    public boolean isSymmetric(TreeNode left, TreeNode right) {  
10.	        if (left == null && right == null) {  
11.	            return true;  
12.	        }  
13.	          
14.	        if (left == null || right == null) {  
15.	            return false;  
16.	        }  
17.	          
18.	        return left.val == right.val && isSymmetric(left.left, right.right) && isSymmetric(left.right, right.left);  
19.	    }  
20.	}  

 

这篇关于leetcode刷题101 对称二叉树 Symmetric Tree(简单) Python Java的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/648472

相关文章

python panda库从基础到高级操作分析

《pythonpanda库从基础到高级操作分析》本文介绍了Pandas库的核心功能,包括处理结构化数据的Series和DataFrame数据结构,数据读取、清洗、分组聚合、合并、时间序列分析及大数据... 目录1. Pandas 概述2. 基本操作:数据读取与查看3. 索引操作:精准定位数据4. Group

Python pandas库自学超详细教程

《Pythonpandas库自学超详细教程》文章介绍了Pandas库的基本功能、安装方法及核心操作,涵盖数据导入(CSV/Excel等)、数据结构(Series、DataFrame)、数据清洗、转换... 目录一、什么是Pandas库(1)、Pandas 应用(2)、Pandas 功能(3)、数据结构二、安

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

《破茧JDBC:MyBatis在SpringBoot中的轻量实践指南》MyBatis是持久层框架,简化JDBC开发,通过接口+XML/注解实现数据访问,动态代理生成实现类,支持增删改查及参数... 目录一、什么是 MyBATis二、 MyBatis 入门2.1、创建项目2.2、配置数据库连接字符串2.3、入

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

Python安装Pandas库的两种方法

《Python安装Pandas库的两种方法》本文介绍了三种安装PythonPandas库的方法,通过cmd命令行安装并解决版本冲突,手动下载whl文件安装,更换国内镜像源加速下载,最后建议用pipli... 目录方法一:cmd命令行执行pip install pandas方法二:找到pandas下载库,然后

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

Apache Ignite 与 Spring Boot 集成详细指南

《ApacheIgnite与SpringBoot集成详细指南》ApacheIgnite官方指南详解如何通过SpringBootStarter扩展实现自动配置,支持厚/轻客户端模式,简化Ign... 目录 一、背景:为什么需要这个集成? 二、两种集成方式(对应两种客户端模型) 三、方式一:自动配置 Thick