Leetcode-每日一题【剑指 Offer 26. 树的子结构】

题目

输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)

B是A的子结构, 即 A中有出现和B相同的结构和节点值。

例如:

给定的树 A:

3
/ \
4 5
/ \
1 2

给定的树 B:

4
/
1

返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。

示例 1:

输入: A = [1,2,3], B = [3,1]
**输出:**false

示例 2:

输入: A = [3,4,5,1,2], B = [4,1]
**输出:**true

限制:

  • 0 <= 节点个数 <= 10000

解题思路

1.题目要求我们判断B是不是A的子结构,我们用递归来解决这个问题。

2.二叉树 B 为 A 的子结构的情况一共有三种,满足其中一种即可:

①子结构 B 的起点为 A 的根节点,即从 A 的根节点开始和 B 比较, 调用函数 isSubStree:

  • 不相等,则返回 false;
  • 相等,则再比较 左子树和右子树都是否相等,都相等,才返回 true

②子结构 B 在 A 的左子树中,即 B 的起点隐藏在 A 的左子树中,此时调用函数 isSubStructure;

③子结构 B 在 A 的右子树中,即 B 的起点隐藏在 A 的右子树中,此时调用函数 isSubStructure。

3.举个例子:

我们先从 A 的根节点开始和 B 比较,调用函数 isSubStree:

根节点相等,则再比较 左子树和右子树都是否相等,都不1相等,返回 false。

我们猜测子结构 B 在 A 的左子树中,即 B 的起点隐藏在 A 的左子树中,此时调用函数 isSubStructure

在左子树中调用函数 isSubStree,根节点都不同则返回 false;再往左子树走,

依旧不同,此时我们返回上一级,去看看右子树

也不同,此时A的左子树全部检索完毕,我们需要检索右子树

这时我们调用函数 isSubStree,根节点相等,则再比较 左子树和右子树都是否相等,都相等,返回 true。代表我们找到了子结构。

代码实现

java 复制代码
lass Solution {
    public boolean isSubStructure(TreeNode A, TreeNode B) {
        if(A == null || B == null){
            return false;
        }
        if(isSubTree(A, B)){
            return true;
        }
        if(isSubStructure(A.left, B) || isSubStructure(A.right, B)){
            return true;
        }
        return false;

    }
    boolean isSubTree(TreeNode TA, TreeNode TB){
        if(TB == null){
            return true;
        }
        if(TA == null){
            
            return false;
        }
        if(TB.val != TA.val){
            return false;
        }
        return isSubTree(TA.left , TB.left) &&
        isSubTree(TA.right, TB.right);
    }

}

测试结果

相关推荐
往事随风去6 分钟前
Redis的内存淘汰策略(Eviction Policies)有哪些?
redis·后端·算法
神里流~霜灭27 分钟前
(C++)数据结构初阶(顺序表的实现)
linux·c语言·数据结构·c++·算法·顺序表·单链表
一只乔哇噻1 小时前
java后端工程师进修ing(研一版 || day41)
java·开发语言·学习·算法
愚润求学1 小时前
【贪心算法】day7
c++·算法·leetcode·贪心算法
要开心吖ZSH1 小时前
软件设计师备考-(十六)数据结构及算法应用(重要)
java·数据结构·算法·软考·软件设计师
带娃的IT创业者1 小时前
如何开发一个教育性质的多线程密码猜测演示器
网络·python·算法
Aczone283 小时前
硬件(六)arm指令
开发语言·汇编·arm开发·嵌入式硬件·算法
luckys.one7 小时前
第9篇:Freqtrade量化交易之config.json 基础入门与初始化
javascript·数据库·python·mysql·算法·json·区块链
~|Bernard|9 小时前
在 PyCharm 里怎么“点鼠标”完成指令同样的运行操作
算法·conda
战术摸鱼大师9 小时前
电机控制(四)-级联PID控制器与参数整定(MATLAB&Simulink)
算法·matlab·运动控制·电机控制