面试经典150题——相同的树

person in black shirt and blue denim jeans standing on brown sand beach during daytime

1. 题目描述

image-20240415121844662

2.  题目分析与解析

要编写一个判断两棵二叉树是否完全相同的代码,首先需要理解何谓“完全相同”的二叉树。完全相同意味着两棵树的结构完全一致,并且所有对应的节点上的值也必须相同。

1. 定义问题

首先明确问题定义:给定两棵二叉树的根节点,判断这两棵树是否完全相同。

2. 基础情况考虑

对于递归函数,你需要首先考虑最简单的情况,也就是递归的终止条件:

  • 两个节点都为空:如果两个树的当前节点都是空,那么在这一部分,它们显然是相同的,应返回true

  • 一个节点为空:如果其中一个节点为空而另一个不为空,这两棵树在此处结构不同,应返回false

3. 分解问题

一旦通过了基础情况的判断,下一步是比较当前两个节点的值:

  • 节点值不相同:如果两个节点的值不一样,那么这两棵树在这个节点上不相同,应返回false

4. 递归比较子树

如果当前节点的值相同,接下来需要判断这两个节点的子树是否相同:

  • 使用递归分别比较左子树和右子树。只有当一个节点的左子树与另一个节点的左子树相同,且右子树也相同,这两个节点才真正相同。

5. 合并结果

根据递归调用的结果,如果左右子树都相同,则返回true,否则返回false

代码思路:

  1. 检查两个节点是否同时为空。

  2. 检查两个节点是否有一个为空而另一个不为空。

  3. 比较两个节点的值。

  4. 递归地比较两个节点的左子树和右子树。

这个逻辑清晰而直接,使用递归使得代码简洁且易于理解。这种方法也体现了分而治之的策略,将大问题(比较整棵树)分解成小问题(比较节点和其子节点)。通过递归调用,小问题的解决方案帮助我们解决整个大问题。

3. 代码实现

image-20240415122725125

image-20240415122554199

4. 相关复杂度分析

要分析给定代码的时间和空间复杂度,我们先要考虑每个函数调用涉及的操作以及如何扩展到整个树。

时间复杂度
  1. 遍历所有节点:这段代码通过递归调用函数isSameTree来访问两棵树的每个节点。在最坏的情况下,即当两棵树完全相同或者只在最后一个节点处不同,我们需要遍历树中的所有节点。因此,时间复杂度依赖于树中节点的数量。

  2. 每个节点访问一次:对于每个节点,我们执行常数时间的操作,包括比较节点的值,以及检查节点是否为null。因此,每个节点的处理时间是常数,O(1)。

综上,如果树有n个节点,那么时间复杂度是O(n),因为需要访问每个节点一次。

空间复杂度

空间复杂度主要由递归调用栈的深度决定,这取决于树的结构:

  1. 最坏情况 - 不平衡树:如果树是高度不平衡的,例如所有节点都只有左子节点或右子节点,那么递归调用将会跟随一条从根到叶的路径,递归深度等于较矮的那个树的高度,因为在对比时发现不等就会立刻返回。在这种情况下,如果树的高度是h,那么空间复杂度将是远小于O(h)的。

  2. 最好情况 - 完全平衡树:对于完全平衡的二叉树,高度大约是log(n),其中n是节点数。因此,递归调用的深度也是log(n),空间复杂度将是O(log(n))。

  3. 平均情况:对于大多数实际应用中的树结构(既非完全不平衡,也非完全平衡),空间复杂度一般视为O(log(n)),假设树大致平衡。

综合来看,时间复杂度是O(n),空间复杂度在O(log(n))。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RC4Drop加密技术:原理、实践与安全性探究

title: RC4Drop加密技术:原理、实践与安全性探究 date: 2024/4/18 20:47:30 updated: 2024/4/18 20:47:30 tags: RC4算法流加密安全性RC4Drop技术密钥流加密解密网络通信 第一章:介绍 1.1 加密技术的重要性 加密技术在当今信息社会中扮演着至关重要的…

R语言计算:t分布及t检验

t分布理论基础 t分布也称Student’s t-distribution,主要出现在小样本统计推断中,特别是当样本量较小且总体标准差未知时,用于估计正态分布的均值。其定义基于正态分布和 X 2 X^{2} X2分布(卡方分布)。如果随机变量X服…

Matlab r2023b Simulink 给子系统添加封面

写这篇记录的原因是,r2023b版本里改动了自定义封面的界面,而我是一个新手小白,零基础,探索一天之后发现实现方法。最终效果如图: 步骤1:打开软件,点击Simulink,再打开含有子系统的工…

【基础】在GCC中编译和链接不是一个命令

在 GCC(GNU Compiler Collection)中,编译和链接不是一个命令。编译是将源代码转换为目标代码的过程。它主要进行语法检查、词法分析、生成中间代码等操作。链接是将多个目标文件和库文件组合成一个可执行文件的过程。在 GCC 中,通…

Cesium实现加载离线地形数据(nginx发布数据,cesiumLab地形切片数据)

实现效果如图: 详细步骤 1 下载地形数据(DEM) 下载地址:地理空间数据云 (gscloud.cn) 操作步骤: 注意:第3步可以自主选择DEM的分辨率,然后下载。 下载结果解压后如下图: 2 使用…

C语言 递归

递归指的是在函数的定义中使用函数自身的方法。 举个例子: 从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?“从前有座山,山里有座庙,庙里有个老和尚&…

python3高级特性

1. 装饰器 装饰器是 Python 的一种高阶函数,它可以在不修改函数内部代码的情况下,给函数增加额外的功能。 案例:记录函数执行时间的装饰器 import time def timing_decorator(func): def wrapper(*args, **kwargs): start_time time.t…

lua学习笔记18(面相对象之多态)

print("*****************************面相对象多态*******************************") --相同方法不同执行逻辑 object{} object.id1 function object:new()local obj{}self.__indexself setmetatable(obj,self)return obj end function object:subClass(className)…

PLC程序远程上下载

在工业自动化领域,PLC(可编程逻辑控制器)扮演着至关重要的角色。然而,传统的PLC程序上传与下载方式往往受限于物理距离和现场环境,给工程师们带来了诸多不便。如今,随着远程技术的不断发展,PLC程…

基于XML配置bean(一)

文章目录 1.获取bean的两种方式1.通过id获取bean(前面用过)2.通过类型获取bean(单例时使用)1.案例2.代码1.beans.xml2.SpringBeanTest.java3.结果 3.注意事项 2.三种基本依赖注入方式1.通过属性配置bean(前面用过&…

Eureka基础介绍和使用

目录 一.理论基础 二.父项目 2.1 新建父项目 2.2 管理依赖 三.子项目 3.1 新建子项目 3.2 注册中心Server依赖和启动类和配置文件 3.3 生产者Client 依赖和启动类和配置文件 3.5 消费者Custmer依赖和配置类、启动类和配置文件 四.心跳 五.公共资源项目 5.1新建实体…

BUG:vue表单验证校验不报错,必填都有信息,就是不能正常往下进行

vue表单验证未报错却出现异常 框架bug场景解决办法 框架 UI:element-UI 前端:vue2 bug场景 正常表单里面,有的信息要求必填或者加了一些限制,作为校验验证,只有走到校验才会执行其他行为,比如调用保存接…

labelimg安装和使用(解决闪退问题)

🌈个人主页:Rookie Maker 🔥 系列专栏:计算机视觉 🏆🏆关注博主,随时获取更多关于IT的优质内容!🏆🏆 😀欢迎来到我的代码世界~ 😁 喜…

C++修炼之路之list--C++中的双向循环链表

目录 前言 一:正式之前先回顾数据结构中的双向循环链表 二:list的简介 三:STL中list常用接口函数的介绍及使用 1.构造函数接口 2.list迭代器 范围for 3.数据的修改接口函数 4.list容量操作函数 5.list的迭代器失效 6.演示代码和测…

【网络编程】Web服务器shttpd源码剖析——线程池调度

hello !大家好呀! 欢迎大家来到我的网络编程系列之web服务器shttpd源码剖析——线程池调度,在这篇文章中,你将会学习到在Linux内核中如何创建一个自己的并发服务器shttpd,并且我会给出源码进行剖析,以及手绘…

allure2教程-3-测试报告定制

领取资料,咨询答疑,请➕wei: June__Go 上一小节,我们学习一下pytestallure2生成html测试报告的方法,本小节我们学习一下allure2测试报告的定制。 allure2报告预览 预览网址:https://demo.qameta.io/allure/# allur…

[leetcode] minimum-falling-path-sum

. - 力扣(LeetCode) 给你一个 n x n 的 方形 整数数组 matrix ,请你找出并返回通过 matrix 的下降路径 的 最小和 。 下降路径 可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多…

归并排序了解吗?手撕一个我看看?

目录 1- 归并排序原理1-1 主要思想1-2 实现步骤 2- 归并排序代码实现(双指针)⭐ 归并排序 ——实现思路 3- ACM模式实现 1- 归并排序原理 1-1 主要思想 归并排序基于分治 将序列中待排序的数数字分为若干组,每个数字分为一组 将若干组两两合并,保证合…

3D模型处理的多进程并行【Python】

今天我们将讨论如何使用 Python 多进程来处理大量3D数据。 我将讲述一些可能在手册中找到的一般信息,并分享我发现的一些小技巧,例如将 tqdm 与多处理 imap 结合使用以及并行处理存档。 NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生…

【蓝桥杯2025备赛】素数判断:从O(n^2)到O(n)学习之路

素数判断:从O( n 2 n^2 n2)到O(n)学习之路 背景:每一个初学计算机的人肯定避免不了碰到素数,素数是什么,怎么判断? 素数的概念不难理解:素数即质数,指的是在大于1的自然数中,除了1和它本身不再有其他因数的自然数。 …