遞歸設計思路:
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)