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

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

目录

题目概述(中等难度)

思路与代码

思路展现

代码示例

总结

题目概述(中等难度)

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

总结

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


相关文章
|
4月前
|
算法 JavaScript Java
【状态压缩】【动态规划】【C++算法】1125.最小的必要团队
【状态压缩】【动态规划】【C++算法】1125.最小的必要团队
|
10月前
|
算法
代码随想录算法训练营第二十天 | LeetCode 530. 二叉搜索树的最小绝对差、501. 二叉搜索树中的众数、236. 二叉树的最近公共祖先
代码随想录算法训练营第二十天 | LeetCode 530. 二叉搜索树的最小绝对差、501. 二叉搜索树中的众数、236. 二叉树的最近公共祖先
42 0
|
12月前
|
算法
贪心算法的思路和典型例题
贪心算法的思路和典型例题
|
存储 算法 Python
秒懂算法 | 子集树模型——0-1背包问题的回溯算法及动态规划改进
给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为W。一种物品要么全部装入背包,要么全部不装入背包,不允许部分装入。装入背包的物品的总重量不超过背包的容量。问应如何选择装入背包的物品,使得装入背包中的物品总价值最大?
487 0
秒懂算法 | 子集树模型——0-1背包问题的回溯算法及动态规划改进
二叉搜索树的后序遍历序列(中等难度)
二叉搜索树的后序遍历序列(中等难度)
80 0
二叉搜索树的后序遍历序列(中等难度)
|
算法 测试技术
全排列Ⅱ(中等难度,加入剪枝操作)
全排列Ⅱ(中等难度,加入剪枝操作)
107 0
全排列Ⅱ(中等难度,加入剪枝操作)
|
算法
二叉树中和为某一值的路径(中等难度)
二叉树中和为某一值的路径(中等难度)
76 0
二叉树中和为某一值的路径(中等难度)
|
存储
二叉搜索树与双向链表(中等难度)(好题目)
二叉搜索树与双向链表(中等难度)(好题目)
99 0
二叉搜索树与双向链表(中等难度)(好题目)