Leetcode刷题笔记32-对称二叉树

1. 题目

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

例如,二叉树 [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

说明:

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

2. 优答

(1)递归

判断二叉树根节点的左结点的的左右子树是否等于根节点的右结点的右左子树。

python3

扫描二维码关注公众号,回复: 1613351 查看本文章
class Solution(object):
    def symmetric(self, left, right):
        if not left and not right:
            return True
        if not left or not right:
            return False
        return left.val == right.val and self.symmetric(left.left, right.right) and self.symmetric(left.right, right.left)

    def isSymmetric(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        if not root: return True
        return self.symmetric(root.left, root.right)
root = TreeNode(1)
root.left, root.right = TreeNode(2), TreeNode(2)
root.left.left, root.right.right = TreeNode(3), TreeNode(3)
root.left.right, root.right.left = TreeNode(4), TreeNode(4)
solution = Solution()
s = solution.isSymmetric(root)
print(s)

(2)迭代

先判断的左结点的左子树和右结点的右子树。先两边后中间。

class Solution(object):
    def isSymmetric(self, root):
        if root is None: return True
        stack = []
        stack.append(root.left)
        stack.append(root.right)
        while stack:
            p, q = stack.pop(), stack.pop()     # p is root.right, q is root.left ### 后进先出
            if p is None and q is None: continue
            if p is None or q is None or p.val != q.val:
                return False
            stack.append(p.left)
            stack.append(q.right)
            stack.append(p.right)
            stack.append(q.left)
        return True

root = TreeNode(1)
root.left, root.right = TreeNode(2), TreeNode(2)
root.left.left, root.right.right = TreeNode(3), TreeNode(3)
root.left.right, root.right.left = TreeNode(4), TreeNode(4)
solution = Solution()
s = solution.isSymmetric(root)
print(s)

猜你喜欢

转载自www.cnblogs.com/Joyce-song94/p/9191498.html