剑指offer 26树的子结构

news2024/9/21 22:44:17

文章目录

  • 题目详情
  • 分析
    • 判断A中有出现和B相同的结构和节点值
    • 递归主体,解决问题
  • 完整代码
  • 总结

题目详情

树的子结构
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。
在这里插入图片描述

分析

对于树的问题,我们要充分利用递归的思想,通过递归的思想,能够将复杂的问题简化解决,比如这道题。

判断A中有出现和B相同的结构和节点值

public static boolean recur(TreeNode A, TreeNode B) {
        if (B == null) {
            return true; // B已经为空了,是A的子结构,返回true
        }
        if (A == null || A.val != B.val) {
            return false;  // 返回为false的情况,A是空但B不是空或者A节点的值不等于B节点的值
        }
        // 满足前面两条,我需要再去检查左子树,右子树是否分别满足
        return recur(A.left, B.left) && recur(A.right, B.right);
    }

递归主体,解决问题

最关键的部分解决了,然后我们看怎么使用上面的结构去解决问题

public boolean isSubStructure(TreeNode A, TreeNode B) {
        return (A != null && B != null) && (recur(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B));
        
    }

这个递归主体就比较精炼了。
首先看
入口 (A != null && B != null) 返回true,不然就直接是错误了。
recur(A, B) 判断当前A中有出现和B相同的结构和节点值, 如果没有,我就去看isSubStructure(A.left, B) 左子树有没有,或者isSubStructure(A.right, B)右子树。注意里面是用"||",即recur(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B)
如此问题得到解决。

完整代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isSubStructure(TreeNode A, TreeNode B) {
        return (A != null && B != null) && (recur(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B));
        
    }
    public static boolean recur(TreeNode A, TreeNode B) {
        if (B == null) {
            return true; // 已经找到
        }
        if (A == null || A.val != B.val) {
            return false;
        }
        return recur(A.left, B.left) && recur(A.right, B.right);
    }
}

总结

对于树的问题,有限考虑能不能通过递归的方式进行解决,一般而言,通过递归能使问题简化,更容易解决。
注意:面试时,会经常问到关于树的问题,比如这道题在360面试的时候,就问到了。

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

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

相关文章

合并两个有序链表

文章目录 1.题目描述2.解题思路方法1:方法2: 1.题目描述 题目链接:力扣21,合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 2.解题思路 方法1:…

【python】多进程和多线程

【Python】多线程 概念 同一时间内能够执行多个任务 执行方式 并发:多个任务交替去运行 并发:多喝CPU中,多个任务是在多个CPU上运行的 一般来说:并发和并行是同时存在的,是操作系统自动调用的 实现方式 多进程实…

系统集成项目管理工程师 笔记(第九章:项目成本管理)

文章目录 9.1.1 成本与成本管理概念 329项目成本管理的过程 9.1.2 相关术语 331成本的类型(6种)应急储备与管理储备 9.2.3 项目成本管理计划制订的 输出 3349.3.1 项目成本估算的主要相关因素 335项目估算还需要考虑但 容易被忽视的 主要因素 9.3.2 项目…

随机森林(Random Forest)简单介绍

文章目录 随机森林(Random Forest)简单介绍1. 介绍2. 工作原理2.1 随机森林的基本原理2.1.1 随机采样2.1.2. 随机选特征2.1.3. 多数表决 2.2 随机森林的建模过程2.2.1. 建立多颗决策树2.2.2. 特征随机选择2.2.3. 样本随机选择2.2.4. 决策树训练与生成2.2…

发现【Stable-Diffusion WEBUI】的神奇插件:离线自动翻译中文提示词

文章目录 (零)前言(一)提示词翻译(Prompt Translator)(1.1)尚需改进 (零)前言 本篇主要提到了WEBUI的提示词翻译插件,之前我说不喜欢联网的插件&a…

【单目标优化算法】沙猫群优化算法(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

【011】pandas处理数据的作用_#py

pandas操作 1. 导入数据库2. 修改行列名2.1 修改列名2.2 修改行名 3. 按条件筛选3.1 根据条件筛选,提取所有信息3.2 根据条件筛选,提取某列或者某几列 4. 按某行某列提取信息4.1 获取信息4.2 更改具体的值 5. 合并5.1 单列并入大数据中(方法一…

根据虚拟地址,如何求出页号和偏移量?

方法掌握 虚拟地址划分成虚拟页号和虚拟页偏移量。 物理地址同样可划分为物理页号和物理页偏移量 如何划分,关键点在于页面的大小。 假设给你一个十进制表示的地址20000,一个页面的大小为4KB,那么如何找出地址20000的具体位置呢&#xff1f…

消息队列介绍

一、消息队列(MQ)概述 消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以简单地描述为: 当不需要立即获得结果,但是并发量又需要进行控制的时候,差不多就是需要使用消息队…

如何获取“上帝”的系统版本

如何获取“上帝”的系统版本 在对技术支持过程中,每个公司都难免会遇到这样一个困扰:我们的程序明明在内部环境中测试的好好的,但是到了客户手里总会出现各种问题。 从以往累计的经验来看,这类问题通常和客户的系统环境有关。所…

PHP库存管理系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP库存管理系统 是一套完善的web设计系统,对理解php编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为PHP APACHE,数据库为 mysql5.0,使用php语言开发。 php 库…

【redis】redis分布式锁(一)手写分布式锁1.0~6.0

redis分布式锁(入门) 文章目录 redis分布式锁(入门)前言一、面试题redis的用法:CAP 二、锁的种类三、一个靠谱分布式锁需要具备的条件和刚需四、分布式锁五、重点六、Base案例(bootredis)1.0、最…

如何使用WordPress建立在线辅导网站(3个步骤)

在线辅导网站在过去几年中变得非常流行。随着越来越多的人转向远程工作和学习,这个行业已成为在家赚取额外收入的绝佳方式。 此外,提供在线指导可以帮助您成为所在领域的权威。 如果您想提供在线辅导,最好的方法通常是通过您自己的辅导网站…

并发编程中的三大问题剖析与解决

java并发编程中的三大问 可见性原因分析:解决: 原子性原因分析:解决: 有序性解决: 首先让我们来了解一下JUC JUC(Java Util Concurrent)是Java提供的一个并发编程工具包,它解决了在多…

【Linux】进程地址空间的初步理解

目录 程序地址空间空间布局图引入物理地址与虚拟地址的概念虚拟地址空间虚拟地址与物理地址是如何对应的?※父子进程独立性的理解(重点)fork两个返回值的原理地址空间为什么要存在?补充理解 程序地址空间空间布局图 (这…

IDEA 新版安装教程

目录 一、安装IDEA 1、双击安装,然后下一步 2、修改默认安装路径,自定义目录。(建议所有开发工具都放在同一个盘符) 3、改为自定义安装路径,下一步。(不用使用中文或空格) 4、创建桌面图标等 5、点击安装&#x…

02.DolphinScheduler数据源中心

文章目录 MySQLHIVE数据源使用HiveServer2使用 HiveServer2 HA Zookeeper Clickhouse MySQL 填写参数 数据源:选择 MYSQL数据源名称:输入数据源的名称描述:输入数据源的描述IP 主机名:输入连接 MySQL 的 IP端口:输入…

一维卷积与一维平均池化的时间复杂度

计算请参考这篇文章: (284条消息) 卷积神经网络的时间、空间复杂度以及数据流的变化_卷积的时间复杂度_Briwisdom的博客-CSDN博客 1. 时间复杂度 时间复杂度即模型的运行次数。 单个卷积层的时间复杂度:Time~O(M^2 * K^2 * Cin * Cout) //有的好奇小宝…

Spring(11. 循环依赖 - 周阳)学习笔记

上一篇 :10. 面试问题简析 文章目录 1. Spring AOP1.1. Aop 常用注解1.2 测试前的准备工作1.2.1 业务类1.2.2 切面类 1.3 Spring4 下的测试1.3.1 POM 文件1.3.2 创建测试类1.3.3 Aop 测试结果 1.4 Spring 5 下的测试1.4.1 POM 文件1.4.2 创建测试类1.4.3 Aop 测试结…

e签宝,「进化」在2023

精准布局生态化、统一化、智能化、信创化,辅以具体产品落地;加速产业、行业、企业、业务,“四业”互通互联,提高产业数字化渗透率。电子签“群战”时代,e签宝再次进化。 作者|斗斗 出品|产业家 “印章在谁手上&…