前者是剑指offer上的题目,后者属于力扣。主要差别就在于对于以下例子,前者返回True,后者返回False。
3 4
/ \ / \
4 5 1 2
/ \
1 2
/
0
树的子结构时:
class Solution:
def HasSubtree(self, pRoot1, pRoot2): #在树A中用递归遍历寻找和树B一样的根节点,如果有,则进入子树的对比。
# write code here
result=False
if pRoot1!=None and pRoot2!=None:
if pRoot1.val==pRoot2.val:
result=self.comparetreeAandtreeB(pRoot1,pRoot2)
if result==False:
result=self.HasSubtree(pRoot1.left, pRoot2)
if result==False:
result=self.HasSubtree(pRoot1.right, pRoot2)
return result
def comparetreeAandtreeB(self,pRoot1,pRoot2):
if pRoot2==None: #到达树B的叶节点
return True
if pRoot1==None: #到达树A的叶节点
return False
if pRoot1.val!=pRoot2.val:
return False
if pRoot1.val==pRoot2.val:
return self.comparetreeAandtreeB(pRoot1.left,pRoot2.left) and self.comparetreeAandtreeB(pRoot1.right,pRoot2.right)
树的子树时,在第二个函数稍作修改即可
def comparetreeAandtreeB(self,pRoot1,pRoot2):
if pRoot2==None:
if pRoot1==None:
return True
else:
return False
if pRoot1==None:
return False
if pRoot1.val!=pRoot2.val:
return False
if pRoot1.val==pRoot2.val:
return self.comparetreeAandtreeB(pRoot1.left,pRoot2.left) and self.comparetreeAandtreeB(pRoot1.right,pRoot2.right)