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
Note:
Bonus points if you could solve it both recursively and iteratively.
先看迭代解法,就是先序遍历,不过顺序是左子树按照root->left->right顺序,右子树按照root->right->left顺序比较每次遍历的节点是否相等。
# 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
"""
# use preorder to traverse root.left and root.right
if not root: return True
stack1, stack2 = [root.left], [root.right]
while stack1 and stack2:
n1, n2 = stack1.pop(), stack2.pop()
if n1 and n2 and n1.val == n2.val:
if n1.right and n2.left:
stack1.append(n1.right)
stack2.append(n2.left)
elif n1.right or n2.left:
return False
if n1.left and n2.right:
stack1.append(n1.left)
stack2.append(n2.right)
elif n1.left or n2.right:
return False
elif n1 or n2:
return False
return len(stack1)==0 and len(stack2)==0
优化下:
class Solution(object):
def isSymmetric(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
# use preorder to traverse root.left and root.right
if not root: return True
stack1, stack2 = [root.left], [root.right]
while stack1 and stack2:
n1, n2 = stack1.pop(), stack2.pop()
if not n1 and not n2: continue
if (n1 and not n2) or (n2 and not n1): return False
if n1.val != n2.val: return False
stack1.append(n1.right)
stack2.append(n2.left)
stack1.append(n1.left)
stack2.append(n2.right)
return len(stack1)==0 and len(stack2)==0
递归解法:
# 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
"""
# use preorder to traverse root.left and root.right
if not root: return True
def is_equal(l, r):
if l and r:
if l.val != r.val: return False
return is_equal(l.left, r.right) and is_equal(l.right, r.left)
else:
return l == r
return is_equal(root.left, root.right)
BFS:
# 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
"""
# use preorder to traverse root.left and root.right
if not root or root.left == root.right: return True
def is_one_null(n1, n2):
return (n1 and not n2) or (not n1 and n2)
if is_one_null(root.left, root.right): return False
q = [root.left, root.right]
while q:
leng = len(q)
for i in xrange(0, leng/2):
l, r = q[i], q[leng-1-i]
if l.val == r.val:
if is_one_null(l.left, r.right) or is_one_null(l.right, r.left):
return False
else:
return False
q = [node for n in q for node in (n.left, n.right) if node]
return True
或者是将两个待比较的节点放在一起入队和出队。
# 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
"""
# use preorder to traverse root.left and root.right
if not root: return True
def is_one_null(n1, n2):
return (n1 and not n2) or (not n1 and n2)
q = collections.deque([root.left, root.right])
while q:
n1, n2 = q.popleft(), q.popleft()
if not n1 and not n2: continue
if is_one_null(n1, n2): return False
if n1.val != n2.val: return False
q.append(n1.left)
q.append(n2.right)
q.append(n1.right)
q.append(n2.left)
return True
黄色部分可以简化下代码。避免冗余的if判断!
再度优化下之前的stack 迭代代码:
class Solution2:
def isSymmetric(self, root):
if root is None:
return True
stack = [[root.left, root.right]]
while len(stack) > 0:
pair = stack.pop(0)
left = pair[0]
right = pair[1]
if left is None and right is None:
continue
if left is None or right is None:
return False
if left.val == right.val:
stack.insert(0, [left.left, right.right])
stack.insert(0, [left.right, right.left])
else:
return False
return True
这种题目就是考察是否细心。
public boolean isSymmetric(TreeNode root) {
return root==null || isSymmetricHelp(root.left, root.right);
}
private boolean isSymmetricHelp(TreeNode left, TreeNode right){
if(left==null || right==null)
return left==right;
if(left.val!=right.val)
return false;
return isSymmetricHelp(left.left, right.right) && isSymmetricHelp(left.right, right.left);
}
黄色部分等价于:
if(p==null && q==null) return true;
if(p==null || q==null) return false;
标签:right,return,Tree,Symmetric,n1,n2,101,root,left From: https://blog.51cto.com/u_11908275/6381012