算法的学习笔记—树的子结构(牛客JZ26)

server/2024/12/22 14:28:24/

img

😀前言
算法面试中,二叉树相关的问题经常出现,其中一个经典的问题是判断一棵二叉树B是否是另一棵二叉树A的子结构。本文将深入探讨这个问题,并通过代码示例展示如何解决这一问题。

🏠个人主页:尘觉主页

文章目录

  • 😊树的子结构
    • 🤗题目链接
    • 😆问题描述
      • 🤔示例
      • 数据范围
    • 😋解题思路
      • 💖Java实现
      • 💖代码解析
    • 😄总结

😊树的子结构

🤗题目链接

牛客

😆问题描述

我们有两棵二叉树A和B,要求判断B是否是A的子结构。需要注意的是,题目明确规定了空树不是任何树的子结构。

假如给定A为{8,8,7,9,2,#,#,#,#,4,7},B为{8,9,2},2个树的结构如下,可以看出B是A的子结构

img

🤔示例

  • 示例1:

    输入:A = {8,8,7,9,2,#,#,#,#,4,7}B = {8,9,2}

    输出:true

  • 示例2:

    输入:A = {1,2,3,4,5}B = {2,4}

    输出:true

  • 示例3:

    输入:A = {1,2,3}B = {3,1}

    输出:false

数据范围

  • 0 ≤ A的节点个数 ≤ 10000
  • 0 ≤ B的节点个数 ≤ 10000

😋解题思路

要判断B是否为A的子结构,我们可以采用递归的方法。具体步骤如下:

  1. 判断当前节点是否匹配:
    • 从二叉树A的根节点开始,判断当前节点是否与树B的根节点相同。
    • 如果相同,进一步递归判断左右子树是否都匹配。
  2. 递归搜索整棵树:
    • 即使当前节点与树B的根节点不匹配,我们仍需递归检查A的左右子树,继续寻找可能的匹配子结构。
  3. 终止条件:
    • 如果树B的所有节点都匹配,返回true
    • 如果树A已经遍历完且没有找到匹配,返回false

💖Java实现

以下是该问题的Java实现代码:

public class Solution {// 主函数,判断B是否为A的子结构public boolean HasSubtree(TreeNode root1, TreeNode root2) {// 如果A或B为空,直接返回falseif (root1 == null || root2 == null)return false;// 检查当前节点,或递归检查左右子树return isSubtreeWithRoot(root1, root2) || HasSubtree(root1.left, root2) || HasSubtree(root1.right, root2);}// 辅助函数,判断以root1为根的树是否包含以root2为根的子结构private boolean isSubtreeWithRoot(TreeNode root1, TreeNode root2) {// 如果B已经遍历完,说明匹配成功if (root2 == null)return true;// 如果A先遍历完,或者当前节点不匹配,返回falseif (root1 == null || root1.val != root2.val)return false;// 递归检查左右子树return isSubtreeWithRoot(root1.left, root2.left) && isSubtreeWithRoot(root1.right, root2.right);}
}

💖代码解析

  1. HasSubtree方法:
    • 这是主函数。首先检查A和B是否为空树。如果是,返回false。否则,调用辅助函数isSubtreeWithRoot判断当前根节点是否匹配,同时递归检查A的左右子树。
  2. isSubtreeWithRoot方法:
    • 这是一个递归函数,用于检查以root1为根的子树是否包含以root2为根的子结构。首先判断root2是否已经遍历完,如果是,返回true。如果root1为空或当前节点的值不相等,返回false。否则,递归检查左右子树是否匹配。

😄总结

这个问题通过递归的方式遍历二叉树,逐步检查是否存在匹配的子结构。尽管递归的方式看似复杂,但它能有效地解决类似问题。理解了这个问题的递归思路,对于二叉树相关的其他问题也会有很大帮助。

希望通过这篇文章,您对二叉树子结构的判断有了更清晰的认识和理解。

😁热门专栏推荐
学习vue的可以看看这个

java基础合集

数据库合集

redis合集

nginx合集

linux合集

手写机制

微服务组件

spring_尘觉

springMVC

mybits

等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

🤔欢迎大家加入我的社区 尘觉社区

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

img


http://www.ppmy.cn/server/104127.html

相关文章

解决图片导入Excel后变成横向问题

最近有同事遇到图片打开的时候是竖向的,导入Excel后就变成横向了 我在网上搜了一下,没找到直接的答案 我猜大概是用了某些软件做处理(例如压缩分辨率)但是没处理干净 后来经过多次尝试,发现只要用windows自带的画图软件…

超容易出成果的方向:多模态医学图像处理!

哈喽朋友们,今天给大家推荐一个比较容易出成果的方向:多模态医学图像处理。 众所周知,多模态如今火的一塌糊涂,早就成了很多应用科学与AI结合的重要赛道,特别是在医学图像处理领域。 由此提出的多模态医学图像处理融合…

换代危机,极氪不得不闯的一关

文|刘俊宏 编|王一粟 “今年,不容我们有任何犯错的机会,如果犯错,一定会全盘皆输。” 面临智能化愈发重要的汽车市场,极氪智能科技CEO安聪慧曾在今年初提醒着极氪汽车(下简称极氪&#xff09…

开发团队学会应对突发的技术故障和危机

文章目录 一、前言二、应对方法2.1 建立应急响应计划2.2 实时监控与预警2.3 快速定位问题2.4 沟通和协调2.5 调整资源2.6 快速评估影响2.7 利用风险管理工具2.8 备份与恢复策略2.9 客户沟通2.10 事后总结与改进2.11 总结和反思 三、总结 一、前言 8月19日下午,网易…

【前端面试】call、apply 、bind、箭头函数

函数除了传参,还有一个调用上下文this,使用call、apply 、bind可以改变函数的this 在实际开发中,选择使用 call、apply 还是 bind 取决于你的具体需求和场景。以下是一些使用这些函数的常见情况: 1. 使用 call 的情况: 当你需要调用一个函数,并且需要明确指定 this 的上下…

组件提前渲染

问题&#xff1a; 组件正常引入并使用的过程中&#xff0c;出现组件第一次渲染不显示&#xff0c;只有再次刷新页面才显示的问题 <el-table-column label"图纸规定" align"center" prop"tzgd" v-if"mbform.zbzd.tzgd" width"…

2408gui,分层窗口2

原文 先取出上篇文章的代码并找到CreateLayeredWindow函数. //创建分层窗口 HWND CreateLayeredWindow(HINSTANCE hInstance, HWND hWnd, int iWidth, int iHeight, int iPosX, int iPosY, COLORREF* colBGRA) {//注册分层窗口RegWindow(hInstance, L"LayeredWindow&quo…

Verilog刷题笔记50

题目&#xff1a; Given the following state machine with 1 input and 2 outputs: 解题&#xff1a; module top_module(input in,input [9:0] state,output [9:0] next_state,output out1,output out2);assign next_state[0]~in&(state[0]|state[1]|state[2]|state[3]…