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
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)