Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
For example, this binary tree is symmetric:
1 / \ 2 2 / \ / \ 3 4 4 3
But the following is not:
1 / \ 2 2 \ \ 3 3
Note:
Bonus points if you could solve it both recursively and iteratively.
Recursive思路:递归过程中,判断三个条件以确定是否对称,对称节点是否有一样的值,左节点的左子树和右节点的右子树是否对称,左节点的右子树和右节点的左子树是否对称,如果是则是对称树
class Solution:
# @param root, a tree node
# @return a boolean
def check(self, left, right):
if left == None and right == None:
return True
if left == None or right == None:
return False
return left.val == right.val and self.check(left.left,right.right) and self.check(left.right, right.left)
def isSymmetric(self, root):
if root == None:
return True
return self.check(root.left, root.right)
Iterative思路:思路很简单,用left和right两个list存取对称节点,判断是否满足对称条件
class Solution:
# @param root, a tree node
# @return a boolean
def isSymmetric(self, root):
if root == None:
return True
left = []
right = []
left.append(root.left)
right.append(root.right)
while len(left) != 0 and len(right) != 0:
temp_l = left.pop(0)
temp_r = right.pop(0)
if temp_l != None and temp_r == None or temp_l == None and temp_r != None:
return False
if temp_l != None:
if temp_l.val == temp_r.val:
left.append(temp_l.left)
right.append(temp_r.right)
left.append(temp_l.right)
right.append(temp_r.left)
else:
return False
return True