当前位置: 首页 > news >正文

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

目录标题

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

问题描述

给定两棵二叉树 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 的左子树或右子树中查找 Breturn playAb(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B);}public boolean playAb(TreeNode A, TreeNode B) {// 如果 B 为空,说明已经遍历完 B,返回 trueif (B == null) {return true;}// 如果 A 为空但 B 不为空,返回 falseif (A == null) {return false;}// 如果 A 和 B 的值不相等,返回 falseif (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.mrgr.cn/news/36401.html

相关文章:

  • 【Tourism】Yuncheng(4)
  • Dubbo入门案例
  • 通信工程学习:什么是PNF物理网络功能
  • 集合ArrayList常用方法
  • 进阶SpringBoot之 Dubbo 及 Zookeeper 安装
  • Netty简介
  • 基于Python大数据的音乐推荐及数据分析可视化系统
  • [Redis][主从复制][上]详细讲解
  • Java内存模型?
  • 客户端数JSON据库SQL操作功能实现代码-———未来之窗行业应用跨平台架构
  • 16.面试算法-树的层次遍历与相关面试题
  • 大觅网之综合管理(Comprehensive Management of Da Mi Network)
  • 【Mysql多数据源实现读写分离的几种方案】
  • 基于深度学习的缺失数据的图像修复
  • 【shell脚本8】Shell脚本学习--其他
  • 最新植物大战僵尸杂交版V2.5.1(包含历史版本)
  • 2024年10月计划(工作为主,Ue5独立游戏为辅,)
  • 每天一道面试题(18):Redis 和 MySQL 如何保证数据一致性
  • 【算法】C++KMP算法的简洁实现
  • 代码随想录Day53|102.沉没孤岛 、103.水流问题 、104.建造最大岛屿