LeetCode题目100:递归、迭代、dfs使用栈多种算法图解相同的树

题目描述

给定两个二叉树的根节点 pq,编写一个函数来检测这两棵树是否相同。如果两棵树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

示例

示例 1

输入:p = [1,2,3], q = [1,2,3]
输出:True

示例 2

输入:p = [1,2], q = [1,null,2]
输出:False


方法一:递归比较

解题步骤
  1. 基本情况:如果两个节点都是 None,返回 True。如果一个是 None 另一个不是,返回 False
  2. 值比较:如果当前两个节点的值不同,返回 False
  3. 递归比较:递归比较左子树和右子树。
Python 示例
class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightdef isSameTree(p, q):"""递归比较两棵树是否相同:param p: TreeNode, 第一棵树的根节点:param q: TreeNode, 第二棵树的根节点:return: bool, 两棵树是否相同"""if not p and not q:return Trueif not p or not q:return Falseif p.val != q.val:return Falsereturn isSameTree(p.left, q.left) and isSameTree(p.right, q.right)# 示例调用
p = TreeNode(1, TreeNode(2), TreeNode(3))
q = TreeNode(1, TreeNode(2), TreeNode(3))
print(isSameTree(p, q))  # 输出: True
算法分析
  • 时间复杂度:(O(n)),其中 (n) 是树中节点的数量,因为需要访问树中的每一个节点。
  • 空间复杂度:(O(h)),其中 (h) 是树的高度,空间消耗来自递归的栈空间。
ASCII 图解过程
[开始比较根节点][1 == 1] -> True|---[左子树比较]|     [2 == 2] -> True|       |--[左子树比较] -> [null == null] -> True|       |--[右子树比较] -> [null == null] -> True||---[右子树比较][3 == 3] -> True|--[左子树比较] -> [null == null] -> True|--[右子树比较] -> [null == null] -> True
[树结构完全匹配] -> True

方法二:迭代使用队列

解题步骤
  1. 初始化队列:将根节点的对 (p, q) 加入队列。
  2. 迭代处理:从队列中取出节点对,比较这两个节点。如果不相同,则返回 False。如果相同,将他们的左孩子和右孩子按对加入队列。
  3. 重复:重复这个过程,直到队列为空。
Python 示例
from collections import dequedef isSameTree(p, q):"""迭代使用队列比较两棵树是否相同:param p: TreeNode, 第一棵树的根节点:param q: TreeNode, 第二棵树的根节点:return: bool, 两棵树是否相同"""queue = deque([(p, q)])while queue:p, q = queue.popleft()if not p and not q:continueif not p or not q:return Falseif p.val != q.val:return Falsequeue.append((p.left, q.left))queue.append((p.right, q.right))return True# 示例调用
p = TreeNode(1, TreeNode(2), TreeNode(3))
q = TreeNode(1, TreeNode(2), TreeNode(3))
print(isSameTree(p, q))  # 输出: True
算法分析
  • 时间复杂度:(O(n))
  • 空间复杂度:(O(n)),在最坏的情况下,如果树完全不平衡,队列可能需要存储所有节点。
ASCII 图解过程
[初始化队列] -> [(1, 1)]|--[比较节点 1 和 1] -> True|   |--[加入子节点对] -> [(2, 2), (3, 3)]||--[比较节点 2 和 2] -> True|   |--[子节点都是 null,跳过]||--[比较节点 3 和 3] -> True|--[子节点都是 null,跳过]
[队列空,结束] -> True

方法三:DFS 使用栈

解题步骤
  1. 使用栈模拟递归:将节点对压入栈中。
  2. 迭代比较:从栈中弹出节点对,进行比较。如果不相同,则返回 False。如果相同,将他们的左孩子和右孩子按对压入栈。
  3. 重复:直到栈为空。
Python 示例
def isSameTree(p, q):"""使用栈实现深度优先搜索比较两棵树是否相同:param p: TreeNode, 第一棵树的根节点:param q: TreeNode, 第二棵树的根节点:return: bool, 两棵树是否相同"""stack = [(p, q)]while stack:p, q = stack.pop()if not p and not q:continueif not p or not q or p.val != q.val:return Falsestack.append((p.right, q.right))stack.append((p.left, q.left))return True# 示例调用
p = TreeNode(1, TreeNode(2), TreeNode(3))
q = TreeNode(1, TreeNode(2), TreeNode(3))
print(isSameTree(p, q))  # 输出: True
算法分析
  • 时间复杂度:(O(n))
  • 空间复杂度:(O(h)),其中 (h) 是树的高度,因为栈的最大深度由树的高度决定。
ASCII 图解过程
[初始化栈] -> [(1, 1)]|--[弹出节点 1 和 1] -> True|   |--[压入子节点对] -> [(3, 3), (2, 2)]||--[弹出节点 2 和 2] -> True|   |--[子节点都是 null,跳过]||--[弹出节点 3 和 3] -> True|--[子节点都是 null,跳过]
[栈空,结束] -> True

总结

这些方法提供了不同的方式来解决确定两棵树是否相同的问题。递归方法直观且易于实现,而迭代方法则在某些情况下可以提供更好的空间效率。选择哪种方法取决于具体情况和个人偏好。这些方法不仅可以应用于算法和数据结构的学习,还可以在实际开发中用于测试框架中验证复杂算法的输出结果或进行自动化测试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/832111.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

prometheus搭建

1.prometheus下载 下载地址:Download | Prometheus 请下载LTS稳定版本 本次prometheus搭建使用prometheus-2.37.1.linux-amd64.tar.gz版本 2.上传prometheus-2.37.1.linux-amd64.tar.gz至服务器/opt目录 CentOS7.9 使用命令rz -byE上传 3.解压缩prometheus-2.37.1.linux…

【C++之map的应用】

C学习笔记---021 C之map的应用1、map的简单介绍1.1、基本概念1.2、map基本特性 2、map的基本操作2.1、插入元素2.2、访问元素2.3、删除元素2.4、遍历map2.5、检查元素是否存在2.6、获取map的大小2.7、清空map2.8、基本样例 3、map的基础模拟实现4、测试用例4.1、插入和遍历4.2、…

Flutter笔记:Widgets Easier组件库(11)- 使用提示吐丝

Flutter笔记 Widgets Easier组件库(11)使用提示吐丝 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this …

【多模态】29、OCRBench | 为大型多模态模型提供一个 OCR 任务测评基准

文章目录 一、背景二、实验2.1 测评标准和结果2.1.1 文本识别 Text Recognition2.1.2 场景文本中心的视觉问答 Scene Text-Centric VQA2.1.3 文档导向的视觉问答 Document-Oriented VQA2.1.4 关键信息提取 Key Information Extraction2.1.5 手写数学公式识别 Handwritten Mathe…

Ubuntu安装配置网络

参考 https://blog.csdn.net/qq_59633155/article/details/131252293https://blog.csdn.net/qq_59633155/article/details/131252293 Ubuntu配置网络 1,查看网络是否连接 终端输入 ping baidu.com 如若成功则如下图所示 如未能成功,则继续按下面步骤…

解决HTTP 403 Forbidden错误:禁止访问目录索引问题的解决方法

解决HTTP 403 Forbidden错误:禁止访问目录索引问题的解决方法 过去有人曾对我说,“一个人爱上小溪,是因为没有见过大海。”而如今我终于可以说,“我已见过银河,但我仍只爱你一颗星。” 在Web开发和服务器管理中&#x…

【精品毕设推荐】基于JSP物流信息网的设计与实现

点击免费下载原文及代码、PPT 摘要 本文讲述了基于JSP物流信息网的设计与实现。该系统使用java语言开发,使系统具有更好的平台性和可扩展性。 该系统实现了用户登录、注册、查询快递信息、快递公司注册成为合作伙伴以及系统管理员对信息进行管理等功能。系统的主…

(三)JVM实战——对象的内存布局与执行引擎详解

对象的内存布局 对象的实例化 对象的创建方式 - new的方式 - Class的newInstance():反射的方式 - Construct的newInstance() - clone:实现Cloneable接口,默认浅拷贝 - 使用反序列化:将二进制流转化为内存对象 创建对象的步骤 - 判断对象对应的类是否加载、链接、初…

You don’t have permission.

The document “XXX” could not be saved. You don’t have permission. 1.查看修改了iOS系统库导致的, 根据提示, 进入到"XXX"文件中, 然后commandz回退/取消 2. Xcode 调试遇到的报错(持续更新)

18_Scala面向对象编程trait

文章目录 trait1.定义trait2.向类中混入特质2.1没有父类2.2有父类 3.动态混入3.1动态混入查询功能到公司业务中 4.父类,子类,特质初始化优先级5.Scala功能执行顺序6.常用API trait –特质的学习需要类比Java中的接口,源码编译之后就是interf…

练习题(2024/5/3)

1对称二叉树 给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true示例 2: 输入:root [1,2,2,null,3,null,3] 输出:false提示: 树中…

(论文阅读-优化器)A Cost Model for SPARK SQL

目录 Abstract 1 Introduction 2 Related Work 3 Background and Spark Basics 4 Cost Model Basic Bricks 4.1 Cluster Abastraction and Cost Model Parameters 4.2 Read 4.3 Write 4.4 Shuffle Read 4.5 Broadcast 5 Modeling GPSJ Queries 5.1 Statistics and S…

QT+网络调试助手+TCP客户端

一、网络调试助手UI界面 编程主要思路: 首先将水平的控件 水平布局 ,然后相对垂直的控件 垂直布局 ,哪怕是底下的groupBox也需要和里面的内容 水平布局,然后最后框选全部 栅格布局。如果需要界面自适应窗口大小&#xff0c…

【白话机器学习系列】白话特征向量

白话特征向量 一个方阵 A A A 与列向量 v v v 的乘积会生成一个新的列向量。这个新向量通常与原向量有着不同的方向,矩阵在这里代表一个线性变换。然而,某些向量会保持其原始方向。我们称这种向量为矩阵 A A A 的特征向量(eigenvector&…

一键 input 苹果 OpenELM,零门槛 Llama 3 教程,40+ 优质模型/数据集/教程,建议收藏!...

现在 AI 行业什么最火? 「大模型」一定仍然排在前三甲的位置。 自从 2022 年底 ChatGPT 面世以来,大模型在各行各业已经带来了太多的惊喜,应用场景愈发丰富,同时也带动了相关底层技术的普及与普适化。尤其是在开源模型繁荣发展之下…

C#核心之面向对象-多态

面向对象-多态 文章目录 1、Vob1、多态的概念2、多态的实现 2、抽象类和抽象方法1、抽象类2、抽象方法 3、接口1、接口的概念2、接口的声明3、接口的使用4、接口可以继承接口5、显示实现接口总结思考 电脑使用USB接口读取数据 4、密封方法 1、Vob 1、多态的概念 多态&#xf…

为什么选择OpenNJet?OpenNJet下一代云原生应用引擎!OpenNJet开发实战!

前言导读 在当今这个数字化转型加速的时代,云原生技术已成为企业和开发者构建现代应用的首选路径。OpenNJet作为新一代云原生应用引擎,在国内外技术社区受到了广泛关注。 本文将深入探讨OpenNJet的特点、优势以及在开发实践中的应用,带您全…

用python画一个正八边形

1 问题 使用turtle库的turtle.fd()函数和turtle.seth()函数绘制一个边长100的正八边形。 2 方法 1、利用for循环解决如何画出图形中相同的八条边的问题。 2、再利用turtle.fd()函数和turtle.seth()函数画出完整的图形。 代码清单 1 import turtleturtle.pensize(2)d0for i in r…

【系统架构师】-选择题(十三)

1、在某企业的营销管理系统设计阶段,属性"员工"在考勤管理子系统中被称为"员工",而在档案管理子系统中被称为"职工",这类冲突称为( 命名冲突)。 同一个实体在同系统中存在不同的命名&am…

智慧旅游引领未来风尚,科技助力旅行更精彩:科技的力量推动旅游业创新发展,为旅行者带来更加便捷、高效和智能的旅行服务

目录 一、引言 二、智慧旅游的概念与特点 (一)智慧旅游的概念 (二)智慧旅游的特点 三、科技推动旅游业创新发展 (一)大数据技术的应用 (二)人工智能技术的应用 (…