思路:
先序遍历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); } }
