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

这篇博客详细解析了一道LeetCode中等难度的编程题,涉及树的子结构与子树的概念区别。通过代码实例展示了如何判断一个树是否包含另一个树的子结构,重点在于递归算法的应用和条件判断的设计。博客总结了该问题的解决思路,并提醒读者与另一道树的子树题目进行对比学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目概述(中等难度)

在这里插入图片描述

题目链接:
点我进入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神的一句话:
在这里插入图片描述
所以就有了以下的代码:

        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));

在这里插入图片描述

总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值