树匹配
- 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)