剑指 Offer(第2版)面试题 26:树的子结构

剑指 Offer(第2版)面试题 26:树的子结构

  • 剑指 Offer(第2版)面试题 26:树的子结构
    • 解法1:递归
    • 解法2:深度优先搜索序列上做串匹配

剑指 Offer(第2版)面试题 26:树的子结构

题目来源:37. 树的子结构

解法1:递归

代码分为两个部分:

  1. 遍历树 A 中的所有非空节点 node;
  2. 判断树 A 中以 node 为根节点的子树是不是包含和树 B 一样的结构,且我们从根节点开始匹配;

对于第一部分,我们直接递归遍历树 A 即可,遇到非空节点后,就进行第二部分的判断。

对于第二部分,我们同时从根节点开始遍历两棵子树:

  1. 如果树 B 中的节点为空,则表示当前分支是匹配的,返回 true;
  2. 如果树 A 中的节点为空,但树 B 中的节点不为空,则说明不匹配,返回 false;
  3. 如果两个节点都不为空,但数值不同,则说明不匹配,返回 false;
  4. 否则说明当前这个点是匹配的,然后递归判断左子树和右子树是否分别匹配即可。

代码:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution
{
public:bool hasSubtree(TreeNode *pRoot1, TreeNode *pRoot2){if (pRoot1 == nullptr || pRoot2 == nullptr)return false;bool result = false;if (pRoot1){if (equal(pRoot1->val, pRoot2->val))result = compare(pRoot1, pRoot2);if (result == false)result = hasSubtree(pRoot1->left, pRoot2) || hasSubtree(pRoot1->right, pRoot2);}return result;}// 辅函数 - 从 pRoot1 和 pRoot2 开始比较两个子树bool compare(TreeNode *pRoot1, TreeNode *pRoot2){if (pRoot2 == nullptr)return true;if (pRoot1 == nullptr)return false;if (equal(pRoot1->val, pRoot2->val) == false)return false;return compare(pRoot1->left, pRoot2->left) && compare(pRoot1->right, pRoot2->right);}// 辅函数 - 判断两个 int 值是否相等bool equal(int x, int y){return x == y;}
};

注意,书上的节点值为 double 类型。在判断两个节点值是否相等时,不能直接写 pRoot1->val == pRoot2->val,这是因为计算机表示小数(float 和 double)时都存在误差。

按书上的树结构,需要将 compare 函数稍作修改:

bool equal(double x, double y)
{if (x - y > -0.000000001 && x - y < 0.000000001)return true;elsereturn false;
}

复杂度分析:

时间复杂度:O(m*n),其中 m 是树 A 中的节点数,n 是树 B 中的节点数。

空间复杂度:O(max(dA, dB)),其中 dA 是树 A 的深度,dB 是树 B 的深度。任意时刻栈空间的最大使用代价是 O(max(dA, dB))。

解法2:深度优先搜索序列上做串匹配

这个方法需要我们先了解一个「小套路」:一棵子树上的点在深度优先搜索序列(即先序遍历)中是连续的。了解了这个「小套路」之后,我们可以确定解决这个问题的方向就是:把 A 和 B 先转换成深度优先搜索序列,然后看 B 的深度优先搜索序列是否是 A 的深度优先搜索序列的「子串」。

详细题解:LeetCode 572. 另一棵树的子树 官方题解

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

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

相关文章

蚂蚁SEO的百度蜘蛛池有哪些优势

一、介绍 SEO是搜索引擎优化&#xff08;Search Engine Optimization&#xff09;的缩写&#xff0c;是一种通过优化网站结构、内容和链接等元素&#xff0c;提高网站在搜索引擎中的排名&#xff0c;从而增加网站流量和吸引更多潜在客户的方法。SEO已成为现代网站管理的重要策…

聚观早报 |一加12首销;华为智能手表释放科技温暖

【聚观365】12月12日消息 一加12首销 华为智能手表释放科技温暖 卡尔动力获地平线战略投资 英伟达希望在越南建立基地 努比亚Z60 Ultra影像规格揭晓 一加12首销 现在有最新消息&#xff0c;近日一加12该机已于昨日开售&#xff0c;售价4299元起。 外观方面&#xff0c;全…

使用rknn-toolkit2将paddleseg模型导出rknn模型

目录 安装paddle2onnx环境 将paddle模型导出onnx模型 安装rknn-toolkits 转化rknn模型 安装paddle2onnx环境 首先创建一个python虚拟环境 conda create -n paddle2onnx python3.10 source activate paddle2onnx 下载并安装 https://github.com/PaddlePaddle/Paddle2ONNX …

pyspark on yarn

背景描述 pyspark 相当于 python 版的 spark-shell&#xff0c;介于 scala 的诡异语法&#xff0c;使用 pyspark on yarn 做一些调试工作还是很方便的。 配置 获取大数据集群配置文件。如果是搭建的 CDH 或者 CDP 可以直接从管理界面下载配置文件。直接下载 hive 组件的客户端…

IDC报告:国内游戏云市场,腾讯云用量规模位列第一

12月12日消息&#xff0c;IDC公布最新的《中国游戏云市场跟踪研究&#xff0c;2022H2》报告&#xff08;以下简称“《报告》”&#xff09;显示&#xff0c;腾讯云凭借全球化节点布局以及国际领先的游戏技术积累&#xff0c;在整体规模、云游戏流路数、CDN流量峰值带宽等多维度…

“未来医疗揭秘:机器学习+多组学数据,开启生物医学新纪元“

在当今的数字化时代&#xff0c;科技正在不断地改变着我们的生活&#xff0c;同时也为医疗领域带来了巨大的变革。随着机器学习的快速发展&#xff0c;以及多组学数据在生物医学中的应用&#xff0c;我们正开启一个全新的医疗纪元。这个纪元以精准诊断、个性化治疗和高效康复为…

Docker容器:Centos7搭建Docker镜像私服harbor

目录 1、安装docker 1.1、前置条件 1.2、查看当前操作系统的内核版本 1.3、卸载旧版本(可选) 1.4、安装需要的软件包 1.5、设置yum安装源 1.6、查看docker可用版本 1.7、安装docker 1.8、开启docker服务 1.9、安装阿里云镜像加速器 1.10、设置docker开机自启 2、安…

K8S(一)—安装部署

目录 安装部署前提以下的操作指导(在master)之前都是三台机器都需要执行 安装docker服务下面的操作仅在k8smaster执行 安装部署 前提 以下的操作指导(在master)之前都是三台机器都需要执行 关闭防火墙 [rootk8smaster ~]# vim /etc/selinux/config [rootk8smaster ~]# swa…

指针浅谈(三)

在指针浅谈(二)http://t.csdnimg.cn/SKAkD中我们讲到了const修饰指针、指针运算、野指针、assert断言和传址调用的内容&#xff0c;今天我们继续学习有关数组名、指针访问数组、一维数组传参的本质相关的内容&#xff0c;内容比较深入&#xff0c;如果觉得哪里讲解的不行&#…

Docker部署Nacos集群并用nginx反向代理负载均衡

首先找到Nacos官网给的Github仓库&#xff0c;里面有docker compose可以快速启动Nacos集群。 文章目录 一. 脚本概况二. 自定义修改1. example/cluster-hostname.yaml2. example/.env3. env/mysql.env4. env/nacos-hostname.env 三、运行四、nginx反向代理&#xff0c;负载均衡…

关于Pytorch和Numpy中的稀疏矩阵sparse的知识点

Pytorch和Numpy中的稀疏矩阵sparse 0 稀疏矩阵类别0.1 coo_matrix0.2 dok_matrix0.3 csr_matrix0.4 csc_matrix0.5 bsr_matrix0.6 bsc_matrix0.7 lil_matrix0.8 dia_matrix 1 pytorch中的稀疏矩阵1.1 to_sparse()1.2 to_sparse_csr()1.3 sparse_coo_tensor()1.4 sparse_csr_ten…

基于Java新人入职管理系统

基于Java新人入职管理系统 功能需求 1、个人信息管理&#xff1a;系统需要提供个人信息管理功能&#xff0c;包括新人的基本信息、联系方式、教育背景、工作经历等。 2、入职流程管理&#xff1a;系统需要提供入职流程管理功能&#xff0c;包括入职手续的办理、合同签订、入…

【JavaEE学习】初识进程概念

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【Java系列】【JaveEE学习专栏】 本专栏旨在分享学习JavaEE的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 一、…

AI:ElasticSearch

ElasticSearch是一款开源的分布式搜索引擎和数据分析引擎&#xff0c;主要用于处理海量数据并提供近实时的搜索和分析功能。它具有全文检索、结构化检索和数据分析等特点&#xff0c;能够满足各种复杂的搜索需求。ElasticSearch使用Java编写&#xff0c;可以运行在多个服务器上…

python:五种算法(GA、OOA、DBO、SSA、PSO)求解23个测试函数(python代码)

一、五种算法简介 1、遗传算法GA 2、鱼鹰优化算法OOA 3、蜣螂优化算法DBO 4、麻雀搜索算法SSA 5、粒子群优化算法PSO 二、5种算法求解23个函数 &#xff08;1&#xff09;23个函数简介 参考文献&#xff1a; [1] Yao X, Liu Y, Lin G M. Evolutionary programming made…

C++中使用汇编

在 C 中编写汇编代码通常需要使用内嵌汇编&#xff08;inline assembly&#xff09;的方式。内嵌汇编允许将汇编代码直接嵌入到 C 代码中&#xff0c;以实现对底层硬件的直接访问和控制。下面是详细解释和示例说明如何在 C 中写汇编代码&#xff1a; 使用内嵌汇编的语法&#x…

百度文库下载要用券?Kotlin爬虫几步解决

百度作为国内知名的网站&#xff0c;尤其是文库里面有各种丰富的内容&#xff0c;对我们学习生活都有很大的帮助&#xff0c;就因为其内容丰富&#xff0c;如果看见好用有意思的文章还用复制粘贴等方式就显得有点落后了&#xff0c;今天我将用我所学的爬虫知识给你们好好上一课…

基于51单片机的语音识别控制系统

0-演示视频 1-功能说明 &#xff08;1&#xff09;使用DHT11检测温湿度&#xff0c;然后用LCD12864显示&#xff0c;语音播放&#xff0c;使用STC11l08xe控制LD3320做语音识别&#xff0c; &#xff08;2&#xff09;上电时语音提示&#xff1a;欢迎使用声音识别系统&#xf…

go-zero开发入门之网关往rpc服务传递数据

go-zero 的网关往 rpc 服务传递数据时&#xff0c;可以使用 headers&#xff0c;但需要注意前缀规则&#xff0c;否则会发现数据传递不过去&#xff0c;或者对方取不到数据。 go-zero 的网关对服务的调用使用了第三方库 grpcurl&#xff0c;入口函数为 InvokeRPC&#xff1a; …

【vue实战项目】通用管理系统:信息列表,信息的编辑和删除

本文为博主的vue实战小项目系列中的第七篇&#xff0c;很适合后端或者才入门的小伙伴看&#xff0c;一个前端项目从0到1的保姆级教学。前面的内容&#xff1a; 【vue实战项目】通用管理系统&#xff1a;登录页-CSDN博客 【vue实战项目】通用管理系统&#xff1a;封装token操作…