剑指offer17-树的子结构
最近全国疫情严重,待在家里没事干,马上又要准备春招了,最近刷刷题,记录一下!再说一句,武汉加油,大家出门记得戴口罩!
1、题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
2、思路
要查找树A中是否存在和树B结构一样的子树,我们可以分为两步:第一步,在树A中找到和树B的根结点值一样的结点R;第二步,判断树A中以R为根结点的子树是不是包含和树B一样的结构,B树有的子节点,A树必须有;B树没有的子节点,A树可以有。
对于这两步,第一步实际上就是树的遍历,第二步是判断是否有相同的结构,这两步都可以通过递归来实现。
3、代码
public class Solution {
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
/*
1、寻找相同的根节点
*/
if(root1==null||root2==null)
return false;
if(root1.val==root2.val && isContain(root1,root2))
return true;
return HasSubtree(root1.left,root2)||HasSubtree(root1.right,root2);
}
/*
2、比较是否包含
*/
public boolean isContain(TreeNode node1,TreeNode node2) {
//我为空,你不为空,说明我不包含你
if(node1==null&&node2!=null)
return false;
//咱两都空,等于值相同
if(node2==null)
return true;
return node1.val==node2.val && isContain(node1.left,node2.left) && isContain(node1.right,node2.right);
}
}