树的子结构(中等难度,好题目)

简介: 树的子结构(中等难度,好题目)

目录

题目概述(中等难度)

思路与代码

思路展现

代码示例

总结

题目概述(中等难度)

2.png


题目链接:

点我进入leetcode


思路与代码

思路展现

这道题目首先跟之前的一道题目非常的类似,但其实有所不同,在此先贴上链接:

另一课树的子树

先来说一点:树的子结构跟子树是完全两个不同的概念,准确来说树的子结构更像是包含了子树的概念,例如对与[1,2,3,4,5]这棵树而言,[2,4,5]是他的子树,但是2不能作为它的子树,但是可以作为子结构.


先来看代码,我们挨个进行解析


代码示例

class Solution {
    public boolean isSubStructure(TreeNode A, TreeNode B) {
        if(A == null || B == null)
        {
            return false;
        }
        if(A.val == B.val && help(A.left,B.left) && help(A.right,B.right))
        {
            return true;
        }
        return (isSubStructure(A.left,B) || isSubStructure(A.right,B));
    }
    private boolean help(TreeNode A, TreeNode B)
    {
        if(B == null && A == null)
        {
            return true;
        }
        if(B == null && A != null)
        {
            return true;
        }
        if(B != null && A == null)
        {
            return false;
        }
        if(A.val == B.val)
        {
            return help(A.left,B.left) && help(A.right,B.right);
        }
        else
        {
            return false;
        }
    }
}

1:首先我们使用help方法来判断是否为子结构,这个方法中既包含了判断是否是子树的if语句,也加入了判断是否为子结构的语句:

if(B == null && A == null)
        {
            return true;
        }

注意这块的B都在A的前面,为什么这么做呢?原因是假设B为null,但是A不为null的时候,就说明B是A的子结构,但是如果B不为null,A为null,就说明此时我们B就不是A的子结构了,这里引用K神的一句话:2.png

所以就有了以下的代码:

        if(B == null && A != null)
        {
            return true;
        }
        if(B != null && A == null)
        {
            return false;
        }

最后假如都不为空,就判断对应的两个节点是否相同,如果相同就判断这连个节点下面各自的子树是否符合子结构的规范,如果都符合,就返回true,有一个不符合返回false,所以也是为什么要用&&的原因:

return help(A.left,B.left) && help(A.right,B.right)

然后就到了我们isSubStructure方法中:

首先还是判断A和B是否为空,假设有一个为空都返回false,B为空返回false的原因是因为题目中说明了约定空树不是任意一个树的子结构,代码如下所示:

if(A == null || B == null)
        {
            return false;
        }

然后就到了下面的判断环节,假设一开始的A和B的根节点都相同,且他们各自的子树都符合子结构的特点,那就直接return true,代码如下所示:

       if(A.val == B.val && help(A.left,B.left) && help(A.right,B.right))
        {
            return true;
        }

否则的话就开始分别判断A的左子树和B,A的右子树和B,只要有一个为真,就说明是有子结构的,返回true即可,也是为什么要用||的原因,代码如下所示:

return (isSubStructure(A.left,B) || isSubStructure(A.right,B));

2.png

总结

这个题目非常经典,好题目,注意下来跟另外一颗树的子树进行对照.


相关文章
|
7月前
|
C++ Python
leetcode-530:二叉搜索树的最小绝对差
leetcode-530:二叉搜索树的最小绝对差
41 0
|
2月前
【LeetCode 41】530.二叉搜索树的最小绝对差
【LeetCode 41】530.二叉搜索树的最小绝对差
11 0
|
存储 人工智能 算法
【算法分析与设计】回溯法(上)
【算法分析与设计】回溯法(上)
|
算法
代码随想录算法训练营第二十天 | LeetCode 530. 二叉搜索树的最小绝对差、501. 二叉搜索树中的众数、236. 二叉树的最近公共祖先
代码随想录算法训练营第二十天 | LeetCode 530. 二叉搜索树的最小绝对差、501. 二叉搜索树中的众数、236. 二叉树的最近公共祖先
48 0
算法训练Day21|530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ● 236. 二叉树的最近公共祖先
算法训练Day21|530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ● 236. 二叉树的最近公共祖先
|
机器学习/深度学习 存储 人工智能
代码随想录训练营day21| 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先...
代码随想录训练营day21| 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先...
leetcode 530 二叉搜索树的最小绝对差
leetcode 530 二叉搜索树的最小绝对差
55 0
leetcode 530 二叉搜索树的最小绝对差
二叉搜索树的后序遍历序列(中等难度)
二叉搜索树的后序遍历序列(中等难度)
91 0
二叉搜索树的后序遍历序列(中等难度)