输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

直接递归,
递归结束条件:如果root2为空,返回true(提前判断了root2一开始就为空的情况),那么在root2不为空的情况下,root1为空,说明这里肯定不对,返回false;
主要逻辑判断:如果root1.val==root2.val,那么此时有两种情况,包含这个root节点是子结构的一部分,所以我们进入
1
helper(root1.left,root2.left)&&helper(root1.right,root2.right)
如果不包含这个节点,我们就不能取这个root,所以进入
1
helper(root1.left,root2)||helper(root1.right,root2)
两种情况一种成立就可以,所以中间用||连接
回到开始,如果root1.val!=root2.val,也就是进入那个else判断,那么我们就直接返回这个结果就可以了。
1
helper(root1.left,root2)||helper(root1.right,root2)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;
 
    public TreeNode(int val) {
        this.val = val;
 
    }
 
}
*/
public class Solution {
    public boolean HasSubtree(TreeNode root1,TreeNode root2) {
        if(root2==null)
            return false;
        return helper(root1,root2);
    }
    public boolean helper(TreeNode root1,TreeNode root2)
    {
        if(root2==null)
            return true;
        if(root1==null)
            return false;
        if(root1.val==root2.val)
            return (helper(root1.left,root2.left)&&helper(root1.right,root2.right))||(helper(root1.left,root2)||helper(root1.right,root2));
        else
            return helper(root1.left,root2)||helper(root1.right,root2);
    }
}
01-21 00:09