问题

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

B是A的子结构, 即 A中有出现和B相同的结构和节点值。

例如: 给定的树 A:

1
2
3
4
5
      3
     / \
    4   5
   / \
  1   2

给定的树 B:

1
2
3
4
    4  
   / 
  1   
返回 true因为 B  A 的一个子树拥有相同的结构和节点值

示例 1:

1
2
输入A = [1,2,3], B = [3,1]
输出false

示例 2:

1
2
输入A = [3,4,5,1,2], B = [4,1]
输出true

解法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
class Solution {
    public boolean isSubStructure(TreeNode A, TreeNode B) {
        if(A == null || B == null){
            return false;
        }
        return check(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B);
    }

    public boolean check(TreeNode A, TreeNode B){
        if(B == null){
            return true;
        }
        if(A == null){
            return false;
        }
   
        return A.val == B.val && check(A.left, B.left) && check(A.right, B.right);
    }
}

​ 主要思路是遍历每个结点,找到符合A.val == B.val的结点,然后以这个结点为根节点进行遍历:

  • 如果B == null,说明成功遍历B,返回true
  • 如果A == null,说明成功遍历B,返回false
  • 如果A.val == B.val则接着递归判断A和B的左右子树是否同样满足条件,根据递归结果返回布尔值。