輸入兩棵二叉樹A,B,判斷B是不是A的子結構。(ps:我們約定空樹不是任意一個樹的子結構)


遞歸設計思路:

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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM