樹匹配
- 1.劍指 Offer 26. 樹的子結構
- 2.劍指 Offer 27. 二叉樹的鏡像
- 3.劍指 Offer 28. 對稱的二叉樹
1.劍指 Offer 26. 樹的子結構
判斷:小樹B是否是大樹A的一部分,需要以大樹A的每個為根節點進行匹配判斷。
算法:判斷兩個節點是否相等,相同,遞歸處理,不相同跳出遞歸隱士遍歷A的所有節點。
class Solution(object):def isSubStructure(self, A, B):""":type A: TreeNode:type B: TreeNode:rtype: bool"""def dfs(node1, node2):if node2 == None: # B樹到達葉子節點了return Trueif node1 == None or node1.val != node2.val: # A樹葉子,B樹非葉子 or 兩者的值不相等return Falsereturn dfs(node1.left,node2.left) and dfs(node1.right,node2.right)return bool(A and B) and (dfs(A,B) or self.isSubStructure(A.left, B) or self.isSubStructure(A.right,B))
2.劍指 Offer 27. 二叉樹的鏡像
將二叉樹以根節點為中心,進行中心對稱處理
算法:針對每個節點交換每個節點的左右子樹,遞歸處理左右子樹
class Solution(object):def mirrorTree(self, root):""":type root: TreeNode:rtype: TreeNode""" def dfs(node):if node == None :returnnode.left, node.right = node.right, node.left # 交換左右子樹dfs(node.left)dfs(node.right)dfs(root)return root
3.劍指 Offer 28. 對稱的二叉樹
判斷一棵樹是不是以根節點為中心對稱的結構。
算法:每次對比應該鏡像的節點是否相等,遞歸傳遞應該鏡像的節點。
class Solution(object):def isSymmetric(self, root):""":type root: TreeNode:rtype: bool"""def dfs(node1,node2):if node1 == None and node2 == None: # 對比遞歸到葉子節點輸出return Trueif node1 == None or node2 == None: # 一個到葉子節點,一個未到葉子節點return Falseif node1.val != node2.val: # 非葉子節點值不相等return False return dfs(node1.left, node2.right) and dfs(node1.right, node2.left) # 非葉子節點值相等,也字節點的對成性決定return dfs(root, root)