一、题目描述
二、解题思路
写在注释里面。
三、代码实现
var isSubStructure = function (A, B) {
if (!B || !A) return false
// 如果这次递归传进来的两个根节点相同,那么就从这两个根节点开始,对它们的左右子树对应来判断是否相等
if(A.val == B.val && helper(A.left,B.left) && helper(A.right,B.right)) return true
// 这里如果第一次传进来的AB根节点都不相同,那么就会进递归,分别判断A的左子树和右子树是否存在B的结构,所以这里用或关系即可
return isSubStructure(A.left,B) || isSubStructure(A.right,B)
// 帮助A和B左右子树对应来判断是否相等
function helper(nodeA,nodeB){
// 判断到B本身已经没有后续节点了(前面的节点在A里面都有),不管A后面还有没有,B就已经属于A的一部分了
if(nodeB == null) return true
// 这里B树还有后续节点,但A已经空了,证明A树里面没有B树的结构,直接对这次递归返回false,这个和上面的判空顺序不能对换
if(nodeA == null) return false
// 这里A和B又相等,那么就继续往下面递归
if(nodeA.val == nodeB.val) return helper(nodeA.left,nodeB.left) && helper(nodeA.right,nodeB.right)
// AB不相等,那么直接返回false即可
else return false
}
};