python_leetcode101. 对称二叉树

给定一个二叉树,检查它是否是镜像对称的。

例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

    1
   / \
  2   2
 / \ / \
3  4 4  3

但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

    1
   / \
  2   2
   \   \
   3    3

说明:

如果你可以运用递归和迭代两种方法解决这个问题,会很加分。

开始想法,以上述为例:

    1               一
   / \                
  2   2             二
 / \ / \
3  4 4  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):
        if not root:
            return True
        return self.recursiveTree(root.left, root.right)

    def recursiveTree(self, left, right):
        if not left and not right:
            return True
        if not left or not right:
            return False
        if left.val == right.val:
            return self.recursiveTree(left.left, right.right) and self.recursiveTree(left.right, right.left)
        return False

提交后,看到另一种方法,以做记录:

这里将根节点的左右节点假设成两颗独立的树,递归调用时,因是对称,所以是左树左节点与右树右节点,左树右节点与右树左节点。

   

# 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
        """
        def isSameTree(p,q):
            if not p and not q:
                return True
            if p and q and p.val==q.val:
                l = isSameTree(p.left, q.right)
                r = isSameTree(p.right, q.left)
                return l and r
            else:
                return False
        if not root:
            return True
        else:
            return isSameTree(root.left, root.right)

猜你喜欢

转载自blog.csdn.net/AntiZheng/article/details/82588692