20240226-100. 同一棵树

题目要求

给定两个二叉树 p 和 q 的根,编写一个函数来检查它们是否相同。 如果两个二叉树结构相同并且节点具有相同的值,则认为它们是相同的。

Example 1:

Input: p = [1,2,3], q = [1,2,3]
Output: true

Example 2:

Input: p = [1,2], q = [1,null,2]
Output: false

Example 3:

Input: p = [1,2,1], q = [1,1,2]
Output: false

思路

一道树上的操作题,定👁一看就应该用一种类似递归的算法,只不过这次是从上到下的,因为我们只要找到一个地方不同就说明两棵树不完全一样。因此我们只需要逐层判断,然后在判断左子树、右子树的情况即可。如果两棵树完全一样,则直到左右子树都为空时返回True。

代码

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:bool isSameTree(TreeNode* p, TreeNode* q) {if (p == nullptr && q == nullptr) {return true;} if (p == nullptr || q == nullptr) {return false;} if (p->val != q->val) {return false;}return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);}
};

时间复杂度

基本情况分析: 当树节点(p 和 q)中的一个或两个都为 nullptr 时,就会出现基本情况。这些是恒定时间检查,因此时间复杂度为 O(1)。

递归情况分析: 函数 isSameTree 会针对两棵树中当前节点的左右子节点递归调用。在最坏的情况下,两棵树的叶子节点相同或不同。这意味着两个树中的每个节点都会被调用一次函数。

树遍历: 由于该递归函数会对每个节点精确检查一次(假设在最坏情况下,树是完整且相同的),因此时间复杂度与树中节点的数量成正比。如果每棵树中的节点总数为 n(假设两棵树的结构和节点数都相同,以进行最坏情况分析),则时间复杂度为 O(n),其中 n 是树中的节点数。

因此,isSameTree 函数的时间复杂度为 O(n),其中 n 是两棵树中较大的一棵树的节点数。

空间复杂度

- 在最坏的情况下,树是完全不平衡的,例如,每个节点只有一个子节点,导致递归深度为 `n`,其中 `n` 是树中的节点数。因此,调用栈(在不平衡树的情况下)造成的空间复杂度为 O(n)。
- 在最好的情况下,树是完全平衡的,树的高度为 log(n),因此调用栈导致的最好情况下的空间复杂度为 O(log(n))。

因此,空间复杂度从平衡树的 O(log(n)) 到完全不平衡树的 O(n) 不等。

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

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

相关文章

数一满分150分总分451东南大学920电子信息通信考研Jenny老师辅导班同学,真题大纲,参考书。

记录用来打破的,信息通信考研Jenny老师2024级辅导班同学,数一满分150分,专业课920专业基础综合143,总分451分,一位及其优秀的本科985报考东南大学信息学院的学生,东南大学920考研,东南大学信息科…

vue - - - - Vue3+i18n多语言动态国际化设置

Vue3i18n多语言动态国际化设置 前言一、 i18n 介绍二、插件安装三、i18n配置3.1 创建i18n对应文件夹/文件3.2 en-US.js3.3 zh-CN.js3.4 index.js 四、 mian.js 引入 i18n配置文件五、 组件内使用六、使用效果 前言 继续【如何给自己的网站添加中英文切换】一文之后&#xff0c…

41.仿简道云公式函数实战-数学函数-SUMIF

1. SUMIF函数 SUMIF 函数可用于计算子表单中满足某一条件的数字相加并返回和。 2. 函数用法 SUMIF(range, criteria, [sum_range]) 其中各参数的含义及使用方法如下: range:必需;根据 criteria 的条件规则进行检测的判断字段。支持的字段…

点云从入门到精通技术详解100篇-基于背包激光雷达点云在城市公园单木参数提取中的应用(续)

目录 3 地面滤波及单木分割 3.1 地面滤波(Ground Filtering) 3.2 单木分割(Single-Tree Segmentation)

C++面试 -操作系统-架构能力:内存问题分析与性能优化

内存问题分析: 内存泄漏: 描述什么是内存泄漏,以及它如何在 C 中发生。使用工具(如 Valgrind、AddressSanitizer)来检测和定位内存泄漏。如何预防内存泄漏?使用智能指针、正确释放资源等。 野指针和悬挂指针…

【Leetcode每日一题】二分查找 - 在排序数组中查找元素的第一个和最后一个位置(难度⭐⭐)(18)

1. 题目解析 Leetcode链接:34. 在排序数组中查找元素的第一个和最后一个位置 这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。 核心在于找到给定目标值所在的数组下标区间,设计一个O(logn)的算法。 2. 算法原…

描述C++中的移动语义和完美转发

在C中,移动语义和完美转发是两个高级特性,它们在提高程序性能和资源管理效率方面起着至关重要的作用。这两个特性从C11开始引入,旨在解决传统的拷贝操作可能带来的性能问题,以及在函数模板中如何有效地转发参数的问题。 移动语义…

基于“python+”潮汐、风驱动循环、风暴潮等海洋水动力模拟

原文:基于“python”潮汐、风驱动循环、风暴潮等海洋水动力模拟 前沿 ADCIRC是新一代海洋水动力计算模型,它采用了非结构三角形网格广义波动连续方程的设计,在提高计算精确度的同时还减小了计算时间。被广泛应用于:模拟潮汐和风驱…

Linux系统中毒,应急方法

1、检查用户及密码文件/etc/passwd、/etc/shadow 是否存在多余帐号,主要看一下帐号 后面是否是 nologin,如果没有 nologin 就要注意; 2、通过 who 命令查看当前登录用户(tty 本地登陆 pts 远程登录)、w 命令查看系统信息&#x…

C/C++文本统计分析

#include <iostream> #include <fstream> using namespace std; int GetTxtLine(const char *filename); /* run this program using the console pauser or add your own getch, system("pause") or input loop */ char c[10];//使用文件流从txt文本中读…

2024牛客寒假算法基础集训营2

目录 A.Tokitsukaze and Bracelet B.Tokitsukaze and Cats C.Tokitsukaze and Min-Max XOR D.Tokitsukaze and Slash Draw E and F.Tokitsukaze and Eliminate (easy)(hard) G.Tokitsukaze and Power Battle (easy) 暂无 I.Tokitsukaze and Short Path (plus) J.Tokits…

Qt QWidget 简约美观的加载动画 第五季 - 小方块风格

给大家分享两个小方块风格的加载动画 &#x1f60a; 第五季来啦 &#x1f60a; 效果如下: 一个三个文件,可以直接编译运行 //main.cpp #include "LoadingAnimWidget.h" #include <QApplication> #include <QGridLayout> int main(int argc, char *arg…

CSS 入门手册(二)

目录 12-Overflow 13-下拉菜单 14-提示框 14.1 显示位置&#xff08;左右&#xff09; 14.2 显示位置(上下) 14.3 添加箭头 14.4 淡入效果 15-图片 16-列表 17-表格 17.1 表格宽度和高度 17.2 文字对齐 17.3 表格颜色 18-计数器 19-导航栏 19.1 导航栏UI优化 …

python第七节:条件、循环语句(2)

循环语句 while循环 for循环 组合嵌套循环 break 终止循环&#xff0c;跳出整个循环 continue 终止当前循环&#xff0c;进入下一次循环 pass 空语句&#xff0c;什么都不做&#xff0c;用于保持结构完整 语法1&#xff1a;whlie循环一定要控制好循环条件&#…

Python基础21 面向对象(4)进阶 类的一些内置方法和属性

文章目录 一、模块调用中attr类函数的运用1、执行模块以外的模块调用2、执行模块调用自己 二、\_\_getattribute__()方法的运行逻辑三、item系列方法四、\_\_str__()方法五、\_\_repr__()方法六、自定制格式化方法七、__slots__属性八、\_\_doc__属性九、__module__和__class\_…

pytorch -- torch.nn下的常用损失函数

1.基础 loss function损失函数&#xff1a;预测输出与实际输出 差距 越小越好 - 计算实际输出和目标之间的差距 - 为我们更新输出提供依据&#xff08;反向传播&#xff09; 1. L1 torch.nn.L1Loss(size_averageNone, reduceNone, reduction‘mean’) 2. 平方差&#xff08;…

axios的基本特性用法

1. axios的基本特性 axios 是一个基于Promise用于浏览器和node.js的HTTP客户端。 它具有以下特征&#xff1a; 支持浏览器和node.js支持promiseAPI自动转换JSON数据能拦截请求和响应请求转换请求数据和响应数据&#xff08;请求是可以加密&#xff0c;在返回时也可进行解密&…

如何在 VM 虚拟机中安装 Windows 7 操作系统保姆级教程(附链接)

一、VMware Workstation 虚拟机 没有安装 VM 虚拟机的参考以下文章进行安装&#xff1a; VM 虚拟机安装教程​编辑https://eclecticism.blog.csdn.net/article/details/135713915https://eclecticism.blog.csdn.net/article/details/135713915 二、Windows 7 镜像 点击链接…

大语言模型LLM参数微调:提升6B及以上级别模型性能(LLM系列009)

文章目录 大语言模型LLM参数微调&#xff1a;提升6B及以上级别模型性能&#xff08;LLM系列009&#xff09;序章LLM参数微调的核心原理预训练与微调过程技术细化 LLM参数微调实战案例详解案例一&#xff1a;文本分类任务微调案例二&#xff1a;问答系统任务微调案例三&#xff…

C++:类与对象(2)

创作不易&#xff0c;感谢三连&#xff01; 一、六大默认成员函数 C为了弥补C语言的不足&#xff0c;设置了6个默认成员函数 二、构造函数 2.1 概念 在我们学习数据结构的时候&#xff0c;我们总是要在使用一个对象前进行初始化&#xff0c;这似乎已经成为了一件无法改变的…