问题描述
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
Bonus points if you could solve it both recursively and iteratively.
给定一个二叉树,检查它是否是自身的镜像(即围绕其中心对称)。
最好能递归地和迭代地解决它。
二叉树 [1,2,2,3,4,4,3] 是对称的:
1
/ \
2 2
/ \ / \
3 4 4 3
但这个二叉树 [1,2,2,null,3,null,3] 不对称:
1
/ \
2 2
\ \
3 3
Python 实现
实现一:递归实现(Recursively)
思路很简单,分别从左右两个子树镜像比较节点的值是否相等。
class Solution(object):
def isSymmetric(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
if root == None:
return True
# Recursively.
return self.isEqual(root.left, root.right)
def isEqual(self, n1, n2):
if n1 == None and n2 == None:
return True
elif n1 == None or n2 == None:
return False
elif n1.val == n2.val:
return self.isEqual(n1.left, n2.right) and self.isEqual(n1.right, n2.left)
else:
return False
实现二:迭代实现(Iteratively)
迭代法稍微比较难理解,不过基本思路跟 BFS (广度优先搜索 BreadthFirstSearch)类似。对于根节点而言,左右子树分别用一个列表来储存,这两个列表当作是两个栈(stack)来使用。左列表用于处理左子树,右列表用于处理左子树(注意,这里的左右列表仅仅针对根节点而言)。
每一次比较,都是取左列表的第一个元素与右列表的最后一个元素进行比较(可以理解成是树用中序遍历表示时,取得第一个节点与最后一个节点,在这个题目里这两个节点位置是对称的)。如果两个元素的值(val)相等,则同时出栈,即移出列表,然后分别用他们的子树替代原本在列表中的位置(这一步就跟 BFS 的实现一致)。
这样,在过程只要出现两个比较节点的值不相等,或者两个比较节点不同时存在,则说明树不是对称的。
class Solution(object):
def isSymmetric(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
if root == None:
return True
# Iteratively.
if root.left == None and root.right == None:
return True
if root.left == None or root.right == None:
return False
left_list = [root.left]
right_list = [root.right]
while len(left_list) > 0 and len(right_list) > 0:
if left_list[0].val == right_list[-1].val:
n1 = left_list.pop(0)
n2 = right_list.pop(-1)
if n1.right != None and n2.left != None:
left_list.insert(0, n1.right)
right_list.append(n2.left)
elif n1.right == None and n2.left == None:
pass
else:
return False
if n1.left != None and n2.right != None:
left_list.insert(0, n1.left)
right_list.append(n2.right)
elif n1.left == None and n2.right == None:
pass
else:
return False
else:
return False
return True