Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
For example, this binary tree [1,2,2,3,4,4,3]
is symmetric:
1
/ \
2 2
/ \ / \
3 4 4 3
But the following [1,2,2,null,3,null,3]
is not:
1
/ \
2 2
\ \
3 3
<思路>我想到的还是递归方法,需要写一个辅助的方法。
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def isSymmetric(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
return self.helper(root,root)
def helper(self,left,right):
if left is None and right is None:
return True
if left is None or right is None:
return False
if left.val != right.val:
return False
return self.helper(left.left,right.right) and self.helper(left.right,right.left)
同时discuss里看到迭代的两种方法,DFS和BFS,学习借鉴。
Iterative (DFS):
class Solution(object):
def isSymmetric(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
if root == None:
return True
stack = [root,root]
while stack:
r1 = stack.pop()
r2 = stack.pop()
if r1 == None and r2 == None:
continue
if r1 == None or r2 == None:
return False
if r1.val != r2.val:
return False
stack.append(r1.left)
stack.append(r2.right)
stack.append(r1.right)
stack.append(r2.left)
return True
Iterative (BFS):
class Solution(object):
def isSymmetric(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
if root == None:
return True
queue = collections.deque([root, root])
while queue:
r1 = queue.pop()
r2 = queue.pop()
if r1 == None and r2 == None:
continue
if r1 == None or r2 == None:
return False
if r1.val != r2.val:
return False
queue.append(r1.left)
queue.append(r2.right)
queue.append(r1.right)
queue.append(r2.left)
return True