目录
题目概述(中等难度)
思路与代码
思路展现
代码示例
总结
题目概述(中等难度)
题目链接:
点我进入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));
总结
这个题目非常经典,好题目,注意下来跟另外一颗树的子树进行对照.