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

《剑指offer》Java版 一、引言 《剑指offer》可谓是程序猿面试的神书了,在面试中帮了我很多,大部分面试的算法题都会遇到原题或者是类似的题。但是书上的代码都是C版的,我在这里整理了一份Java版的代码供大家学习参考,这些代码我都是在OJ上跑过全AC的,所以正确性你大可放心。 二、目录 1赋值运算函数 2单例设计模式 3二维数组中查找目标值 4替换字符串中的空格 5从尾到头打印链表 6由前序和中序遍历重建二叉树 7用两... 阅读详情

剑指 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;
	else
		return 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. 另一棵树的子树 官方题解

牛客网剑指Offer - java版 剑指Offer - java版 文章目录剑指Offer - java版JZ01JZ02 替换空格JZ03 从尾到头打印链表JZ04 重建二叉树JZ05 用两个栈实现队列JZ06 旋转数组的最小数字JZ07 斐波那契数列JZ08 跳台阶问题JZ09 青蛙跳台阶JZ10 矩形覆盖JZ11 二进制中1的个数JZ12 数值的整数次方JZ13 调整数组顺序,使奇数位于偶数前面JZ14 链表中倒数第k个结点JZ15 反转链表JZ16 合并两个排序的链表JZ17 树的子结构JZ18 二叉树的镜像JZ19 顺时针打印矩阵J 阅读详情

相关推荐

Linux 命令之 locale -- 设置和显示程序运行的语言环境

文章目录命令介绍locale 设置规则使用详解(一)查看当前 locale 设置(二)查看当前系统所有可用 locale(三)设置系统的 locale 命令介绍 locale 是 Linux 系统中多语言环境的设置接口,在 Linux 中,使用 locale 命令来设置和显示程序运行的语言环境,locale 会根据计算机用户所使用的语言,所在国家或者地区,以及当地的文化传统定义一个软件运行时的语言环境。 通过 locale 来设置程序运行的不同语言环境,locale 由ANSI C提供支持。locale 的

liaowenxiong的博客 3万+

一篇文章带你吃透对称性递归(思路分析+解题模板+案例解读)

引言: 力扣上很多树的题目都是可以用递归很快地解决的,而这一系列递归解法中蕴含了一种很强大的递归思维:对称性递归(symmetric recursion) 什么是对称性递归?就是对一个对称的数据结构(这里指二叉树)从整体的对称性思考,把大问题分解成子问题进行递归,即不是单独考虑一部分(比如树的左子树),而是同时考虑对称的两部分(左右子树),从而写出对称性的递归代码 题型分类: 可以用对称性递归解决的二叉树问题大多是判断性问题(bool类型函数),这一类问题又可以分为以下两类: 1、不需要构造辅助函数。这一.

贾柏寒的博客 649

从Gitee上部署视觉工程到Linux虚拟机

(使用SVM来识别装甲板的编号,此处手机上的图片中只有灯条没有数字,SVM无法识别出编号。这两行代码的意义是,当SVM识别不出或者识别不到编号时,把装甲板的编号默认为2号。找到自瞄程序中,数字识别类下的这两行代码,把注释去掉。这样,每次打开新的终端时,环境变量都会自动设置。(2)查看虚拟机设置选项,检查虚拟机USB接口是否为3.0及以上的接口。如果不是,要更改好。这样,每次打开新的终端时,环境变量都会自动设置。后,每次打开终端时自动设置这些环境变量,你可以将。打开第一个终端,用来挂ROS的内核启动页面。

2301_81035291的博客 1520

剑指offer(26-33题)详解

文章目录26 二叉搜索树与双向链表27 字符串的排列28 数字中出现次数超过一半的数字(待优化)★29 最小的K个数30 连续子数组最大和31 整数中1出现的次数32 把数组排成最小的数33 丑数★ 欢迎关注个人数据结构专栏哈 微信公众号:bigsai 声明:大部分题基本未参考题解,基本为个人想法,如果由效率太低的或者错误还请指正!,如果有误导,还请指正! 26 二叉搜索树与双向链表 题目描述...

bigsai 8133

保姆级教程:用Docker Compose一键部署WVP-PRO+ZLM+录像服务(含Nginx反代)

本文提供了一套完整的容器化GB28181视频平台部署方案,通过Docker Compose实现WVP-PRO、ZLMediaKit(ZLM)和录像服务的一键式部署。详细介绍了环境准备、架构设计、容器化部署实战以及高级配置优化,帮助用户快速搭建高性能视频监控管理平台,适用于安防行业和物联网设备管理场景。

weixin_30415113的博客 860

Ubuntu断网环境下的系统更新:apt-offline保姆级教程(附常见问题排查)

本文详细介绍了在Ubuntu断网环境下使用apt-offline进行系统更新的完整教程,包括环境准备、签名文件生成、数据传输方案对比及常见问题排查。特别适用于企业级开发环境或安全敏感场景,帮助运维人员高效完成离线系统更新,确保系统安全与稳定。

weixin_29214691的博客 358

【LeetCode】剑指 Offer(26)

剑指 Offer 51. 数组中的逆序对

Locky136的博客 1303

在线考试题库抓取:Python 爬虫抓取各类在线考试平台题库和试题

通过这些技术,您可以抓取各类在线考试平台上的题库数据,进行数据分析、生成练习题集,甚至用于考试准备。为了演示抓取过程,本篇博客选择了两个常见的在线考试平台进行数据抓取:一个是教育考试平台(如“中小学题库”),另一个是职业考试平台(如“华图教育”)。对于这些网站,我们需要找到包含题库信息的页面,并分析每一页的 HTML 结构,从而定位到题目、选项、答案等数据。大多数在线考试平台的题库是分页显示的,因此我们需要遍历多个页面,抓取所有的题库数据。因此,我们需要设置合适的请求头来模拟真实的浏览器请求。

2201_76125261的博客 3427

剑指LeetCode 剑指offer26

本人新手为了面试互联网公司,将刷题做一个记录以及总结,方便之后学习!! 第22道问题 剑指offer 26为一道中等题 题目: 力扣https://leetcode-cn.com/problems/shu-de-zi-jie-gou-lcof/ 1.自己思路,要找b是否为a的子树,需要比较当b的根节点与a的根节点相同时,还需要比较左右节点。此题也是参考了题解。之前一直没做对,看了题解之后打开了思路。 使用两次递归。 1.递归b是a的子树,b是a的左子树的子树,或者b是a的右子树的子树。目标就是.

dinosaur_baby的博客 226

Android14 SystemUI如何实现下拉菜单栏高斯模糊背景效果(类似于毛玻璃效果)

我们都知道,从Android12起,下拉菜单栏控制中心都是黑色的,看起来非常不美观,而且国内的手机系统UI都做的比较美观,大部分的下拉菜单UI背景都是实现了高斯模糊效果,所以客户也会要求实现类似于这样的效果。在以前的Android项目中,实现下拉菜单栏的模糊背景就是通过截图的方式进行替换背景,而这种方式下拉菜单背景极易替换不了,就算是在各个地方都适配,还是有概率在复杂场景或者一些测试手法下出现背景是黑的情况,并且这种方式还比较影响性能,毕竟每次都要去截图一次,多做了额外的事。

热衷于Android Framework和系统APP的修改经验分享 1793

10、进化动力学谱分析中的开放性问题

本文探讨了进化动力学谱分析中的若干开放性问题,重点围绕进化算法的性能与设计理论展开。文章首先介绍了规范模型及其线性动力学特性,随后深入分析了在实际应用中偏离理想情况的两个关键因素:有限种群和双亲重组。在此基础上提出了三个核心开放性问题:寻找最优传输矩阵以实现全局最优解的高效搜索、无限与有限种群模型谱之间的关系、以及卡林定理在多遗传算子下的推广可能性。通过谱条件、快速混合性与首次命中时间的关系分析,文章进一步讨论了全局吸引与快速收敛的理论基础,并提出了未来的研究方向,包括理论深化、实验拓展与跨学科融合,旨在为

cuda7parallel的博客 80

剑指offer面试题26(java版):树的子结构

welcome to my blog 剑指offer面试题26(java版):树的子结构 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构) 笔记 常规情况: 判断A的某个节点值和root2.val是否相等, 是的话判断当前节点的左节点值和root2.left.val是否相等, 当前节点的右节点值和root2.right.val是否相等. 如此递...

littlehaes的博客 501

AI辅助决策支持系统架构设计避坑:5个常见技术选型误区及正确方案

AI辅助决策支持系统(AI-DSS)是指通过人工智能技术(机器学习、自然语言处理、知识图谱等)赋能传统决策支持系统,帮助决策者在复杂业务场景中(如供应链优化、风险控制、医疗诊断、金融投资等)提升决策效率和准确性的系统。与传统BI工具不同,AI-DSS不仅能"展示数据",还能基于数据生成"决策建议"甚至"自动执行决策"。技术选型是AI-DSS架构设计的核心环节,涉及数据处理引擎、模型框架、算力资源、集成接口等关键组件的选择。效果不达标:模型预测精度低、决策建议不可用;成本失控:算力资源浪费、维护成本高企。

AIGC应用创新大全的博客 1381

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

题目: 输入两棵二叉树A和B,判断B是不是A的子结构。 1.解题思路: 第一步:在树A中找到和B的根节点的值一样的节点R; 第二步:判断树A中以R为根节点的子树是不是包含和树B一样的结构; 可以使用递归的方法; 要注意空指针的处理。 2.代码: ...

qq_32486393的博客 151

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

《剑指offer》面试题 26:树的子结构(C++实现)

题目 输入两棵二叉树A和B,判断B是不是A的子结构。 代码 #pragma once // 题目:输入两棵二叉树A和B,判断B是不是A的子结构。 struct BinaryTreeNode { double m_dbValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight; }; /** * 1 递归 查找A中是否有B的...

$慕雪$的博客 288

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

大神整理的剑指Offer【所有面试题汇总】

    剑指Offer学习   剑指Offer这本书已经学习完了,从中也学习到了不少的东西,现在做一个总的目录,供自已和大家一起参考,学如逆水行舟,不进则退。只有不断地学习才能跟上时候,跟得上技术的潮流! 所有代码下载【https://github.com/Wang-Jun-Chao/coding-interviews】 目录 第01-10题 【剑指Offer学习】【面试题02:...

晓飛的博客 3万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

《剑指Offer》Java版目录(源码下载)

《剑指Offer》PDF版下载:点我书中全部50道题目的Java实现如下,java源码下载:点我剑指Offer面试题1面试题2单例模式 剑指Offer面试题3二维数组查找 剑指Offer面试题4替换空格 剑指Offer面试题5反向打印链表 剑指Offer面试题6重建二叉树(根据前序中序输出后序) 剑指Offer面试题7用两个栈实现队列(附带用两个队列实现栈) 剑指Offer面试题8旋转数

login_sonata的博客 4386

剑指offer 面试题26树的子结构

剑指offer 面试题26树的子结构 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构) 思路:数还有子树,那肯定是用递归写比较方便了。题目要做的是从A 中找B ,所以需要遍历一遍A树并且寻找A中与B的头节点相等的那个节点,找到这个节点后就遍历A树和B树,看是否相等。第二个方法的递归结束条件分为三种:一:B是空的了,即意味着所有父节点都相等,所以可...

ChildYH的博客 198

《剑指Offer》解题目录(更新完毕)

题目来源于LeetCode上的《剑指Offer》,这里做一个目录方便大家查找。另外有本人的LeetCode解题目录、《程序员面试金典》可点击链接查看。

Michael是个半路程序员 6160

【剑指Offer学习】【所有面试题汇总】

剑指Offer学习  剑指Offer这本书已经学习完了,从中也学习到了不少的东西,现在做一个总的目录,供自已和大家一起参考,学如逆水行舟,不进则退。只有不断地学习才能跟上时候,跟得上技术的潮流!目录第01-10题【剑指Offer学习】【面试题02:实现Singleton 模式——七种实现方式】【剑指Offer学习】【面试题03:二维数组中的查找】【剑指Offer学习】【面试题04:替换空格】【剑指O

https://github.com/Wang-Jun-Chao 5万+

剑指offer--Java实现

剑指offer合辑之面试01-67 《剑指offer》面试题 Java 代码的 Github 地址 《剑指offer》面试题 Markdown 版本,包含题目、分析及代码的 Github 地址 面试题2 实现单例模式 面试题3 二维数组中的查找 面试题4 替换空格 面试题5 从尾到头打印链表 面试题6 重建二叉树 面试题7 用两个栈实现队列 面试题8 旋转数组的最小数字 面试题9 斐波那契数列...

LYZ 4109

LeetCode 剑指Offer 26 树的子结构

LeetCode 剑指Offer 26 树的子结构题目解题:深度优先搜索 题目 解题:深度优先搜索 相似题目: 题目 解题 面试题 04.10. 检查子树 面试题 04.10. 检查子树解题 剑指 Offer 26. 树的子结构 剑指 Offer 26. 树的子结构解题 本题与 面试题 04.10 的区别在于: 面试题 04.10 约定空树是任意一个树的子树,而本题不是; 面试题 04.10 规定 B 必须和 A 的某棵子树 完全相同 时返回 true;而本题是包含关系,A 中某

346

《剑指Offer》-面试题Python实现合集

《剑指Offer》作为互联网行业求职必看的书籍,其中收录了各大公司招聘时常问到的一些面试题,对于大家通过技术面颇有裨益。因此这个月我也花了接近三周早上的时间,用于通览全书。由于书中是用C++实现的,而本人主要使用Python,因此在掌握解题思路后,采用Python对每个面试题进行了重构。本着先过一遍再慢慢消化和吸收的原则,仓促完成了所有面试题的重构。如有问题,欢迎大家交流讨论~ 全部代码放在了Gi...

kabuto_hui的博客 2658

《剑指offer》刷题——【代码的鲁棒性】面试题26:树的子结构(java实现)

《剑指offer》刷题——【代码的鲁棒性】面试题26:树的子结构(java实现)一、题目描述二、题目分析1. 过程:2. 易出错之处:三、代码实现 一、题目描述 输入两棵二叉树A和B,判断B是不是A的子结构。 二、题目分析 1. 过程: 第一步:在树A中找到和树B的根节点的值一样的节点R 第二步:判断树A中以R为根节点的子树是不是包含和树B一样的结构(左子树、右子树) 2. 易出错之处: ...

HW_870754395的博客 356

剑指Offer22--面试题26. 树的子结构

剑指Offer22--面试题26. 树的子结构 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构) public class Solution { public boolean HasSubtree(TreeNode root1,TreeNode root2) { boolean result = false; if(root1!=null&& root2!=null){ if(root1

zhangyunpeng0922的博客 104

【剑指offer】剑指offer汇总版

文章目录剑指offer汇总3.数组中重复的数字 ★题目描述1.HashSet2.利用下标4.二维数组中的查找 ★1.暴力破解法2.线性查找5.替换空格 ★[面试题05. 替换空格](https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof/)迭代6.从尾到头打印链表 ★1.使用栈2.递归法3.头插法【ps】7.重建二叉树 ★8.用两个栈实现队列 ★9.斐波那契数列 ★1.使用递归2.记忆化递归法3.动态规划4.循环求余法10.青蛙跳台阶问题 ★10-2 变

芝兰生于深谷,不以无人而不芳 1621
上一篇: HTML + JavaScript 实现网页录制音频与下载
下一篇: 剑指 Offer(第2版)面试题 25:合并两个排序的链表
UestcXiye
博客等级 码龄8年 9027粉丝 1306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值