思路:
- 先序遍历A的每个节点N:
isSubStructure
(
A,B
)
- 判断以N为根节点的子树是否包含树B:recur(A,B)
- 对于函数
isSubStructure
(
A,B
)
当
A
为空或者
B
为空时,返回
false
当B为A的子树时,瞒住以下条件中的一个
- 以节点A为根节点的子树包含树B,对应recur(A,B)
- 以A节点的左孩子为根节点的子树包含树B:对应
isSubStructure
(
A.left,B
)
以
A
节点的右孩子为根节点的子树包含树
B
,对应
isSubStructure
(
A.right,B
)
对于函数recur(A,B)
终止条件:
当节点B为空,则证明匹配完毕,返回true
当节点A为空,说明已经越过A的叶子节点,无法匹配,返回false
当节点A和节点B的值不同,说明匹配失败,法兰会false
返回值:
判断A和B的左节点是否相等recur(A.left,B.left)
判断A和B的右节点是否相等recur(A.right,B.right)
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSubStructure(TreeNode A, TreeNode B) {
if(A==null || B==null) return false;
return recur(A,B) || isSubStructure(A.left,B) || isSubStructure(A.right,B);
//当前根节点为A,因此需要再次调用isSubStructure,改变当前根节点,不能直接调用recur
}
public boolean recur(TreeNode A,TreeNode B){
if(B==null) return true;
if(A==null || A.val != B.val) return false;
return recur(A.left,B.left) && recur(A.right,B.right);
}
}