美团一面:给定两棵二叉树 `A` 和 `B`,判断 `B` 是否是 `A` 的子结构?

news2024/11/19 14:53:02

目录标题

    • 问题描述
    • 思路分析
    • 代码解释
    • 详细步骤
    • 复杂度分析

问题描述

给定两棵二叉树 AB,判断 B 是否是 A 的子结构。所谓子结构是指 B 中任意节点在 A 中存在相同的结构和节点值。

例子1:
在这里插入图片描述

输入:tree1 = [1,7,5], tree2 = [6,1]
输出:false
解释:tree2 与 tree1 的一个子树没有相同的结构和节点值。

示例 2:
在这里插入图片描述

输入:tree1 = [3,6,7,1,8], tree2 = [6,1]
输出:true
解释:tree2 与 tree1 的一个子树拥有相同的结构和节点值。即 6 - > 1

思路分析

  1. 基本情况

    • 如果 AB 为空,则 B 不可能是 A 的子结构,返回 false
  2. 递归检查

    • 检查当前节点 AB 是否相等。
    • 如果相等,继续递归检查 AB 的左右子树是否也相等。
    • 如果不相等,继续在 A 的左子树和右子树中递归查找是否存在与 B 相同的子结构。
  3. 辅助函数 playAb

    • 用于递归比较两个节点及其子树是否相同。
    • 如果 B 为空,说明已经遍历完 B,返回 true
    • 如果 A 为空但 B 不为空,返回 false
    • 如果 AB 的值不相等,返回 false
    • 递归比较 AB 的左右子树。

代码解释

/**
 * 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) {
        // 基本情况:如果 A 或 B 为空,则 B 不可能是 A 的子结构
        if (A == null || B == null) {
            return false;
        }

        // 检查当前节点 A 和 B 是否相等,或者在 A 的左子树或右子树中查找 B
        return playAb(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B);
    }

    public boolean playAb(TreeNode A, TreeNode B) {
        // 如果 B 为空,说明已经遍历完 B,返回 true
        if (B == null) {
            return true;
        }

        // 如果 A 为空但 B 不为空,返回 false
        if (A == null) {
            return false;
        }

        // 如果 A 和 B 的值不相等,返回 false
        if (A.val != B.val) {
            return false;
        }

        // 递归比较 A 和 B 的左右子树
        return playAb(A.left, B.left) && playAb(A.right, B.right);
    }
}

详细步骤

  1. 主函数 isSubStructure

    • 首先检查基本情况,如果 AB 为空,直接返回 false
    • 调用辅助函数 playAb 检查当前节点 AB 是否相等。
    • 如果不相等,递归检查 A 的左子树和右子树中是否存在与 B 相同的子结构。
  2. 辅助函数 playAb

    • 如果 B 为空,说明已经遍历完 B,返回 true
    • 如果 A 为空但 B 不为空,返回 false
    • 如果 AB 的值不相等,返回 false
    • 递归比较 AB 的左右子树,只有当 AB 的左右子树都相等时,才返回 true

复杂度分析

  • 时间复杂度:最坏情况下,每个节点都需要进行比较,时间复杂度为 O(m * n),其中 m 是树 A 的节点数,n 是树 B 的节点数。
  • 空间复杂度:递归调用栈的空间复杂度为 O(h),其中 h 是树的高度。

主要是利用了递归的思想,简洁且易于理解。

在这里插入图片描述

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

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

相关文章

LeaferJS 动画、状态、过渡、游戏框架

LeaferJS 现阶段依然专注于绘图、交互和图形编辑场景。我们引入游戏场景,只是希望让 LeaferJS 被更多有需要的人看到,以充分发挥它的价值 LeaferJS 为你带来了全新的游戏、动画、状态和过渡功能,助你实现那些年少时的游戏梦想。我们引入了丰富…

NVIDIA TAO 工具套件5.3.0学习介绍及操作-01

什么是 NVIDIA TAO 工具套件? NVIDIA TAO 工具套件基于 TensorFlow 和 PyTorch 构建,是 NVIDIA TAO 框架的低代码版本,通过抽象出 AI/深度学习框架的复杂性来加速模型训练过程。TAO 工具套件让您利用迁移学习的强大功能和自己的数据对预训练 …

Remotion:使用前端技术开发视频

前言 最近做文章突然想到很多文章其实也可以用视频的方式来展现,以现在短视频的火爆程度,肯定能让更多的人看到。 恰巧最近看了很多关于动画的前端 js 库,那如果将这些动画帧连续起来,岂不是就成了一个视频吗? 而且…

集成Elasticsearch到django restful

文章目录 集成ES到django restful服务端项目安装haystack基本使用安装配置索引模型ORM模型中新增discount_json字段方法全文索引字段模板 索引序列化器全文搜索的索引视图路由手动构建es索引 集成ES到django restful服务端项目 如果直接在Django项目直接编写代码作为ElasticSe…

YOLOv5白皮书-第Y2周:训练自己的数据集(云jupyter运行版 )

>- **🍨 本文为[🔗365天深度学习训练营](小团体~第八波) 中的学习记录博客** >- **🍖 原作者:[K同学啊](K同学啊-CSDN博客)** 目录 前言 一、.xml文件里保存的是什么 二、准备好自己的数据 三、创建split_tr…

spring boot 3 + 虚拟线程 + MDC traceId

虚拟线程(Virtual Thread)也称协程或纤程,是一种轻量级的线程实现,与传统的线程以及操作系统级别的线程(也称为平台线程)相比,它的创建开销更小、资源利用率更高,是 Java 并发编程领…

ChatGPT-4模型镜像站对比和【软件开发人员】提示词

AI如今很强大,聊聊天、写论文、搞翻译、写代码、写文案、审合同等等,ChatGPT 真是无所不能~ 作为一款出色的大语言模型,ChatGPT 实现了人类般的对话交流,最主要是能根据上下文进行互动。 接下来,我将介绍 ChatGPT 在…

活动|华院计算参与《数字生态指数2024》报告发布并受邀主题分享

9月20-21日,“第二届数字生态与治理论坛暨数字生态指数2024发布会”在湖北省武汉市举办。华院计算作为研究团队一员受邀出席论坛,并发表“人工智能赋能基层社会治理”主题演讲。 《数字生态指数2024》报告为国家对外积极调整全球数字治理战略定位&#x…

UE学习篇ContentExample解读------Blueprint_Communication-下

文章目录 总览描述批次阅览2.1 Using an Event Dispatcher function to call an event in the level Blueprint2.2 Binding an Event Dispatcher function to a custom event2.3 Binding an Event Dispathcer to a custom event on spawn3.1 Basic communication using a Bluep…

Java Set类

欢迎来到Cefler的博客😁 🕌博客主页:折纸花满衣 🏠个人专栏:Java 目录 👉🏻set1. 接口与实现2. 特性3. 常用方法4. 示例代码5. 遍历6. 线程安全 👉🏻set更多方法1. 其他常…

赛氪作媒体支持单位受邀参加首届科普翻译与跨学科专业学术研讨会

2024年9月22日,正值全国科普日之际,首届科普翻译与跨学科专业学术研讨会在上海健康与营养研究所信息中心励志厅成功举行并圆满结束。此次研讨会汇聚了来自全国各地的近60名专家学者、学界及企业界代表,共同探讨科普翻译与跨学科专业的发展。作…

封装一个vue3的文件上传组件(拖拽或点击选择文件)

1. 效果 选择文件后: 2. 代码 <template><divclass"drop-zone c-normal":class"{borderOutline: outline,}"dragover.preventdrop.prevent"handleDrop"click"chooseFiles"><div v-if"files.length < 1"…

FLStudio21Mac版flstudio v21.2.1.3430简体中文版下载(含Win/Mac)

给大家介绍了许多FL21版本&#xff0c;今天给大家介绍一款FL Studio21Mac版本&#xff0c;如果是Mac电脑的朋友请千万不要错过&#xff0c;当然我也不会忽略掉Win系统的FL&#xff0c;链接我会放在文章&#xff0c;供大家下载与分享&#xff0c;如果有其他问题&#xff0c;欢迎…

使用Vue.extend( ) 模仿 elementui 创建一个类似 message 消息提示框

提示&#xff1a;记录工作中遇到的需求及解决办法 文章目录 前言一、目录结构二、代码1. 创建 m-Toast.vue 文件2. 创建 global.js 文件3. 在 main.js 文件中导入 global.js 文件4. 在 App.vue 文件中使用 全局方法创建的 组件 前言 在此之前一直不明白Vue.extend( )干什么用的…

PCL 用八叉树完成空间变化检测

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1八叉树构建与变化检测 2.1.2检测变化的点云 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xff08;长期更…

快速排序(C语言实现)

目录 基本概念 Hoare版本 动图演示 思路 代码实现&#xff1a; 性能分析 取Key优化 三数取中法选择基准&#xff08;Median-of-Three Partitioning&#xff09; 实现步骤 代码实现 挖坑法 基本步骤 动图 示例说明 代码实现 前后指针法 动图示范 思路 代码实…

Linux操作系统中docker

1、docker概述 1、什么是docker Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中&#xff0c;然后发布到任何流行的 Linux或Windows&#xff08;对于windows不是太友好&#xff09;操作系统的机器上&#xff0c;也可以…

Amazon EC2:权限设置指南,构建安全的云环境

在数字化转型的浪潮中&#xff0c;企业纷纷将业务迁移到云端&#xff0c;以提高灵活性和效率。Amazon Elastic Compute Cloud&#xff08;EC2&#xff09;作为 AWS 的核心服务之一&#xff0c;为企业提供了一个强大的云计算平台。然而&#xff0c;随着云环境的复杂性增加&#…

DHCP 中继器

在实际应用中可能会遇到一个比较大的物理网络中存在多个ip子网&#xff0c;而每个ip子网的主机都需要DHCP服务器来动态分配ip地址&#xff0c;实现的方法有两种: 第一种是在每一个子网中设置DHCP服务器&#xff0c;将其分别为每个子网分配ip地址&#xff0c;但此方法会增加开销…

【Hadoop】【vim编辑器】【~/.bashrc 文件】如何编辑

1. 进入 vim 编辑器 在终端中输入以下命令&#xff1a; vim ~/.bashrc 2. 进入插入模式 打开文件后&#xff0c;你将处于普通模式。在普通模式下&#xff0c;你不能直接编辑文本。 要进入插入模式&#xff0c;请按下 i 键。这时&#xff0c;你应该会看到屏幕底部出现 -- 插…