leetcode(101):Symmetric Tree

题目: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。处理问题要灵活多变。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值