【Leetcode 二叉树】 对称二叉树(101)

题目

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

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

进阶:你可以运用递归和迭代两种方法解决这个问题吗?

解答

分析:先序、中序、后序遍历的结果不能用来比较是否对称。应该用(头-左-右)和(头-右-左)的遍历顺序比较。(头-左-右)就是先序遍历,(头-右-左)不是先序、中序、后序。

递归,对称的条件:先序遍历(头-左-右)和(头-右-左)遍历过程一致。
用Null判断树的结尾。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None


# 比较两种遍历结果是否相等 1: 头--左--右  2:头--右--左
class Solution:
    def isSymmetric(self, root):
        if not root or (not root.left and not root.right):
            return True
        
        def compare_node(node1, node2):
            if node1 == None and node2 == None:  # node1 node2的子树比较到底了,说明对称
                return True
            if node1 == None or node2 == None:  # 其中一个为空,不对称
                return False
            
            if node1.val != node2.val:  # 值不等
                return False
            ans1 = compare_node(node1.left, node2.right)  # 如果对称,node1.left应该等于node2.right
            if not ans1:  # 不等
                return False
            else:  # node1.left等于node2.right,再比较node1.right==node2.left
                return compare_node(node1.right, node2.left)
            
        return compare_node(root.left, root.right)
posted @ 2020-06-07 10:43  961897  阅读(213)  评论(0编辑  收藏  举报