题目:Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
对于题目的分析:这个题目要求判断给定的这棵树是不是关于根节点对称。对于根节点而言,首先需要判断根节点是不是为None形式,如果为None形式,则肯定是对称的,然后判断根节点的二个子树的节点情况,使左右子树关于根节点对称,则再判断在原来判断二颗树是否相同的基础上加以修改,也就是左子树的左节点与右子树的右节点,左子树的右节点与右子树的左节点来进行判断。
python代码如下:
# 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 root == None:
return True
l = root.left
r = root.right
return self.isSame(l, r)
def isSame(self, l, r):
if l and r:
return l.val == r.val and self.isSame(l.left, r.right) and self.isSame(l.right, r.left)
return l is r
大佬的代码如下:
recursively递归的解法,因为树的结构是递归的,所以用递归的方法来求解会比较容易书写。
class Solution:
def isSymmetric(self, root):
if root is None:
return True
else:
return self.isMirror(root.left, root.right)
def isMirror(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:
outPair = self.isMirror(left.left, right.right)
inPiar = self.isMirror(left.right, right.left)
return outPair and inPiar
else:
return False
好吧,我跟大佬的思想是一致的,还是很开心的。递归是用栈来实现的,迭代大佬们也是用栈来实现的。
迭代的解法:
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
对于递归而言,也是利用了栈的结构,其实跟递归的求解是一致的,只是说不同的表现手法,也就是利用了一对一对的入栈出栈来进行处理。
此题得到的思考:
1,在做题的时候,要思考模式,自己之前思考过什么模式,如何应用。
2,能简化书写的要简化书写,但逻辑不能简化。
3,要注意,对于树而言,比较顺畅的是递归的做法,但如果递归的做法做不出来的时候,一定要换一条路子走啊,采用迭代的方法,利用list来进行处理,完成操作。。当然也有stack,queue等,但其实说实话,它们也都是披着老虎面具的羊羔子,实质上还是list。处理问题要灵活多变。