题目描述:
题解一:未通过
这道题可以使用递归的方法解决:
1.递归终止条件:如果输入A或B为空子树,return false。
2.递归返回值:当前A节点是否包含和B相同结构的子树。
3.当前递归:
<1>判断A.val是否等于B.val,如果相等,分别判断A B左右子树是否相等(需要考虑B子树是否为空)
<2>如果A.val!=B.val,分别将A左右子树与B比较。
class Solution(object): def isSubStructure(self, A, B): if A==None or B==None: return False if A.val==B.val: if B.left!=None and B.right!=None: return self.isSubStructure(A.left,B.left) and self.isSubStructure(A.right,B.right) elif B.left!=None: return self.isSubStructure(A.left,B.left) elif B.right!=None: return self.isSubStructure(A.right,B.right) elif B.left==None and B.right==None: return True else: return self.isSubStructure(A.left,B) or self.isSubStructure(A.right,B)
倒数第三个测试用例失败,因为A中可能存在多个和B val相等的节点,匹配的子树位于后面匹配的节点。
题解二:通过
1.dfs(A,B)函数,如果A为空,返回False,如果B为空,返回True(此时的B为题目中输入B的子树,与题目要求空子树不是任何树的子树不冲突)。如果A B节点值相同,且左右子树都匹配则返回True。
2.isSubStructure:如果A或B为空,返回False,否则return self.dfs(A,B) or self.isSubStructure(A.left,B) or self.isSubStructure(A.right,B)
注意:dfs中必须先判断B是否为空,如果为空返回True。
class Solution(object): def isSubStructure(self, A, B): if A==None or B==None: return False return self.dfs(A,B) or self.isSubStructure(A.left,B) or self.isSubStructure(A.right,B) def dfs(self,A,B): if B==None: return True if A==None: return False return A.val==B.val and self.dfs(A.left, B.left) and self.dfs(A.right,B.right)