递归设计思路:
A、判断子树根值是否相等。
A1、如果是相等,需要一个可以判断该根左右孩子结点是否相等的递归函数。
A2、如果不等,找大树的左右孩子结点当根结点,递归到A步骤。
1 # -*- coding:utf-8 -*- 2 # class TreeNode: 3 # def __init__(self, x): 4 # self.val = x 5 # self.left = None 6 # self.right = None 7 class Solution: 8 def HasSubtree(self, pRoot1, pRoot2): 9 # write code here 10 res = False 11 if pRoot1 == None or pRoot2 == None : 12 #根据题干要求返回False 13 return res 14 if pRoot1.val == pRoot2.val: 15 #如果结点相等,Subtree函数负责判断 16 #这两个结点的孩子是否相等 17 res = Solution.Subtree(self, pRoot1, pRoot2) 18 if not res: 19 #当与小树相同的子树不在根部,找大树左子树 20 res = Solution.HasSubtree(self, pRoot1.left, pRoot2) 21 if not res: 22 #左边找到了就不需要再找了 23 res = Solution.HasSubtree(self, pRoot1.right, pRoot2) 24 return res 25 26 def Subtree(self, pRoot1, pRoot2): 27 #下面两个if位置不能反 28 if pRoot2 == None: 29 return True 30 if pRoot1 == None: 31 return False 32 if pRoot1.val != pRoot2.val: 33 return False 34 #左右同时相等时 35 return Solution.Subtree(self, pRoot1.left, pRoot2.left) and \ 36 Solution.Subtree(self, pRoot1.right, pRoot2.right)
为了简化代码,提高代码的阅读障碍,使用短路法
1 class Solution: 2 def HasSubtree(self, pRoot1, pRoot2): 3 # write code here 4 if pRoot1 == None or pRoot2 == None : 5 return False 6 return Solution.Subtree(self, pRoot1, pRoot2) or \ 7 Solution.HasSubtree(self, pRoot1.left, pRoot2) or \ 8 Solution.HasSubtree(self, pRoot1.right, pRoot2) 9 10 def Subtree(self, pRoot1, pRoot2): 11 if pRoot2 == None: 12 return True 13 if pRoot1 == None: 14 return False 15 if pRoot1.val != pRoot2.val: 16 return False 17 return Solution.Subtree(self, pRoot1.left, pRoot2.left) and \ 18 Solution.Subtree(self, pRoot1.right, pRoot2.right)