Leetcode题解——26.树的子结构

2023-11-13

 题目地址:剑指 Offer 26. 树的子结构 - 力扣(LeetCode)

目录

一.解题思路

(一).大体思路

(二).Search函数

(三).Judge函数

二.代码实现

三.拓展思考


5dda85e61daf433aab6e9f34ac47dec2.png

一.解题思路

(一).大体思路

对于二叉树类的题目,一般会使用递归或层序遍历的思路来解决。

对于该题,我们思考后会发现递归就能解决问题。

那么思路就出来了。

因为题目中说明B是A的子结构(或不是),那么B应该小于等于A的大小。

所以选B的树顶作为参照物,从A的树顶开始依次匹配。

当A中节点与B的树顶匹配时,再匹配B中剩下节点,全部一致True;不一致False。

如果False,再开始将B树顶与A剩下节点匹配,直到True或A全部匹配结束False。

因为过程非常模块化,我们完全可以通过多个函数来组合实现,这样代码可读性高。

除了主函数外,我们可以写一个Search函数来寻找A与B树顶匹配节点。

再写一个Judge函数来确定当B树顶与A匹配时剩下节点是否匹配。

(二).Search函数

该函数采用递归的方式进行,总体有两个情况。

①此时节点与B树顶匹配,此时交给Judge函数判断B是否是A子树。

若是,返回True。不是,就继续递归A节点左右子树。

②此时节点与B树顶不匹配,直接递归A节点左右子树。

返回条件:

当A递归到空时,返回False,因为空了就说明这条路上没有能给B匹配的。

需要注意的是,递归时,左右子树的关系是或,当左或右有一个能有B树匹配即可。

(三).Judge函数

该函数的中心思想是查看此时AB节点是否匹配,若匹配就继续判断A左B左以及A右B右。

若不匹配就返回False。

注意:

当B节点到空时,此时说明B中某一分支已经匹配完毕且与A完全一致,直接返回True。

当A节点空时(B不空),此时说明A与B并不匹配,返回False。

PS:看完思路不妨自己先实现一下。

二.代码实现

class Solution {
public:
    bool Judge(TreeNode* a, TreeNode* b)
    {
        if(b == nullptr) return true;
        if(a == nullptr) return false;
        if(a->val != b->val) return false;
        return Judge(a->left, b->left) && Judge(a->right, b->right);//注意是&&的关系
    }
    bool Search(TreeNode* a, TreeNode* b)
    {
        if(a == nullptr) return false;
        if(a->val == b->val && Judge(a, b)) return true;
        return Search(a->left, b) || Search(a->right, b);
    }
    bool isSubStructure(TreeNode* A, TreeNode* B) {
        if(A == nullptr || B == nullptr) return false;//判空
        return Search(A, B);
    }
};

三.拓展思考

本题也可以使用非递归的方式来实现。

我们只需要将Search函数和Judge函数改造成层序遍历A树即可。

  bool Search(TreeNode* a, TreeNode* b)
    {
        queue<TreeNode*> qu;
        qu.push(a);
        while(!qu.empty())
        {
            TreeNode* tmp = qu.front();
            qu.pop();
            if(tmp->val == b->val && Judge(tmp, b)) return true;
            if(tmp->left) qu.push(tmp->left);
            if(tmp->right) qu.push(tmp->right);
        }
        return false;
    }
bool Judge(TreeNode* a, TreeNode* b)
    {
        queue<TreeNode*> qua, qub;
        qua.push(a);
        qub.push(b);
        while(!qub.empty())
        {
            TreeNode* tmpa = qua.front(), *tmpb = qub.front();
            if(tmpa->val != tmpb->val) return false;
            if(tmpb->left)
            {
                if(tmpa->left == nullptr) return false;
                qua.push(tmpa->left);
                qub.push(tmpb->left);
            }
             if(tmpb->right)
            {
                if(tmpa->right == nullptr) return false;
                qua.push(tmpa->right);
                qub.push(tmpb->right);
            }
            qub.pop();qua.pop();
        }
        return true;
    }

 

 

 先把数据结构搞清楚,程序的其余部分自现。—— David Jones


 如有错误,敬请斧正

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Leetcode题解——26.树的子结构 的相关文章

  • sql-labs 41-65关

    Less 41 这关还是堆叠注入 而且还是数字型闭合 可以照搬39关代码 但是与39不同的是 这关没有报错的显示位 查数据 id 1 id 0 union select 1 select group concat username from

随机推荐

  • 计数排序--时间复杂度为线性的排序算法

    我们知道基于比较的排序算法的最好的情况的时间复杂度是O nlgn 然而存在一种神奇的排序算法 不是基于比较的 而是空间换时间 使得时间复杂度能够达到线性O n k 这种算法就是本文将要介绍的计数排序 一 适用情况 这个算法在n个输入元素中每
  • 卷积神经网络超详细介绍

    文章目录 1 卷积神经网络的概念 2 发展过程 3 如何利用CNN实现图像识别的任务 4 CNN的特征 5 CNN的求解 6 卷积神经网络注意事项 7 CNN发展综合介绍 8 LeNet 5结构分析 9 AlexNet 10 ZFNet 1
  • layui option 动态添加_layui select 动态加载案例

    用到知识点 表单监听 form on 局部表单渲染 form render 动态加载的select表单 必须有默认的option项 第一个option 要不然layui 不会渲染出 select 组件 代码如下 添加数据 返回列表 查找所有
  • Vue中子组件通过v-model动态修改父组件中的值

    父子通信中的子传父 使用v model实现双向数据绑定 注意 vue组件是此组件的根组件 是该组件中所有注册的组件的父组件 现有需求 通过子组件中的输入框来动态绑定父组件中data中的数据 代码实现 父组件使用porps来向子组件传值 子组
  • 为什么浏览器中有些文件点击后是预览,有些是下载

    今天给大家分享两个比较有用的浏览器行为与预期不一致的现象 这两个问题其实并不是什么难题 但在工作中发现不少人被难住了 在我的印象中至少有三位同事在群里问这样的问题 上周又有同事被此现象困住了 所以我觉得这应该是个共性问题 在这里分享给大家
  • 物理服务器和云服务器的区别

    1 从概念上区分 云服务器 云主机 是在一组集群服务器商虚拟出多个类似独立服务器的部分 集群中每个服务器上都有该云服务器的一个镜像 形象地讲 集群服务器犹如一个大型的公共停车场 而云服务器的使用 则是卖给了你停车的权利 独立服务器 顾名思义
  • 如何做数据清洗?

    一 预处理阶段 预处理阶段主要做两件事情 一是将数据导入处理工具 通常来说 建议使用数据库 单机跑数搭建MySQL环境即可 如果数据量大 千万级以上 可以使用文本文件存储 python操作的方式 而是看数据 这里包含两个部分 一是看元数据
  • 第四章 索引和视图 总结

    第四章 索引和视图 1 索引 索引主要分为聚类索引和非聚类索引 聚类索引 表中数据行的物理存储顺序与索引顺序完全相同 每个表只能有一个聚类索引 物理的重拍表中的数据以符合索引约束 用于经常查找的列 非聚类索引 不改变表中数据行的物理存储位置
  • linux系统中解决docker: command not found

    新申请了一台阿里云的服务器 打算在上边部署一个容器服务 竟然发现机器上连docker都没安装 如果是mac OS系统 可以参考文章 mac系统中解决docker command not found 解决 针对这个问题 今天特意记录了一下 我
  • 网上总结的字节跳动前端面试题

    1 jQuery与Vue的区别是什么 Vue vue是一个兴起的前端js库 是一个精简的MVVM 从技术角度讲 Vue js 专注于 MVVM 模型的 ViewModel 层 它通过双向数据绑定把 View 层和 Model 层连接了起来
  • Python爬虫常见异常及解决办法

    文章目录 1 selenium common exceptions WebDriverException Message unknown error cannot find Chrome binary 方法一 配置参数 方法二 修改源文件
  • mysql学习-mysql数据类型学习01

    数据类型概览 数值类型 整数类型包括 TINYINT SMALLINT MEDIUMINT INT BIGINT 浮点数类型包括 FLOAT 和 DOUBLE 定点数类型为 DECIMAL tinyint smallint mediumin
  • 【MySQL】MYSQL内核:INNODB存储引擎 卷1pdf——百度网盘下载

    百度网盘地址 https pan baidu com s 1p4CsmBhYzrIawwUznmByYw 资源来之不易 需要获取密码 请关注公众号 全栈船长 并回复数字 0002
  • 前端开发:JS中截取字符串的用法总结,高级Android程序员必会

    var a 0123456789 a substring 5 2 4 start 和 stop 有字符串 但是最后的输出结果是 234 a substring 5 hh start 和 stop 有字符串 但是最后的输出结果是 234 二
  • 计算机在汽车设计方面的应用属于计算机的,计算机技术辅助设计在汽车设计中的应用.pdf...

    82 车辆与动力工程 Vehicles and Power Engineering 2017 年 2 月 计算机技术辅助设计在汽车设计中的应用 温 欣 汪 家宇 杨 海 南 沈 阳理工 大学 辽 宁 沈 阳 110159 摘 要 随着社会经
  • keil软件调试(Debug)仿真教程(软件调试和硬件调试的区别)及常用调试按键详解

    文章目录 前言 一 什么是软件调试 Debug 有什么用 二 keil Debug常用按钮 总结 前言 单片机的调试分为两种 一种是使用软件模拟调试 第二种是硬件调试 两种调试方式各有不同 软件模拟调试有误差 而硬件调试 借用仿真器调试是嵌
  • 新斗罗大陆手游服务器维护,《新斗罗大陆》新ss魂师天青龙牛天修复公告

    亲爱的魂师大人 新SS魂师天青龙牛天首发后 小舞收到了大量意见反馈 部分魂师大人认为牛天战斗结果异常 过高的伤害与其魂师定位不符 我们在接收到反馈的第一时间 进行了紧急核查 随后 我们发现该问题是由牛天的技能 龙魂觉醒 导致 当牛天施展该技
  • AQS原理解析及源码分析

    目录 1 介绍下AQS几个重要的组件 2 内部成员变量state 3 同步队列NODE 4 等待队列 condition AbstractQueuedSynchronizer又称为队列同步器 后面简称AQS AQS的核心思想是 如果被请求的
  • 对比梯度下降和正规方程解性能

    现在用导数的方式模拟线性回归中的梯度下降法 首先再来回顾一下梯度下降法的基础 梯度下降法不是一个机器学习算法 而是一个搜索算法 梯度下降法用在监督学习中 梯度下降法的过程 对比模型输出值和样本值的差异不断调整本省权重 直到最后模型输出值和样
  • Leetcode题解——26.树的子结构

    题目地址 剑指 Offer 26 树的子结构 力扣 LeetCode 目录 一 解题思路 一 大体思路 二 Search函数 三 Judge函数 二 代码实现 三 拓展思考 一 解题思路 一 大体思路 对于二叉树类的题目 一般会使用递归或层