题目链接
https://leetcode.com/problems/symmetric-tree/
题目原文
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
题目翻译
给定一个二叉树,判断它是否是自己的镜像(中心对称)。
思路方法
思路一
递归,对于每个节点,检查树的左右节点值是否相等,同时判断:左节点的左子树和右节点的右子树是否对称、右节点的左子树和左节点的右子树是否对称。
代码
# 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 """
if not root:
return True
return self.mirror(root.left, root.right)
def mirror(self, left, right):
if not left or not right:
return left == right
if left.val != right.val:
return False
return self.mirror(left.left, right.right) and self.mirror(left.right, right.left)
思路二
非递归算法。算是将上面的递归方法改写成非递归方法,实际上是深度优先搜索(DFS)。
代码
# 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 """
if not root:
return True
stackl, stackr = [root.left], [root.right]
while len(stackl) > 0 and len(stackr) > 0:
left = stackl.pop()
right = stackr.pop()
if not left and not right:
continue
elif not left or not right:
return False
if left.val != right.val:
return False
stackl.append(left.left)
stackl.append(left.right)
stackr.append(right.right)
stackr.append(right.left)
return len(stackl) == 0 and len(stackr) == 0
思路三
除了可以DFS,也可以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 """
if not root:
return True
queuel, queuer = [root.left], [root.right]
while len(queuel) > 0 and len(queuer) > 0:
left = queuel.pop()
right = queuer.pop()
if not left and not right:
continue
elif not left or not right:
return False
if left.val != right.val:
return False
queuel.insert(0, left.left)
queuel.insert(0, left.right)
queuer.insert(0, right.right)
queuer.insert(0, right.left)
return len(queuel) == 0 and len(queuer) == 0
PS: 新手刷LeetCode,新手写博客,写错了或者写的不清楚还请帮忙指出,谢谢!
转载请注明:http://blog.csdn.net/coder_orz/article/details/51579528