判断二叉树是否对称

2,143 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

判断二叉树是否对称

问题描述

请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。

示例:二叉树 [1, 2, 2, 3, 4, 4, 3] 是对称的,而二叉树[1, 2, 2, null, 3, null, 3] 则不是镜像对称的:

image.png

分析问题

首先,我们来看一下对称二叉树的定义。对称二叉树是指满足以下条件的二叉树:对于树中的任意两个对称节点L和R,一定有:

  • L.val = R.val,即两个对称节点的值是相等的。
  • L.left.val = R.right.val,即L的左子节点的值要和R的右子节点的值相等。
  • L.right.val = R.left.val,即L的右子节点的值要和R的左子节点的值相等。

所以,我们可以从顶至底进行递归处理,然后判断每对节点是否对称,从而判断树是否为对称二叉树。

image.png

image.png

image.png

image.png

image.png

下面我们来看一下代码的实现。

class Solution:
    def isSymmetric(self, root):
        #如果为空树,直接返回True
        if not root:
            return True
        #递归判断
        def is_recur(L, R):
            #如果同时到达叶子节点,则返回True
            if not L and not R:
                return True
            #如果有一个到达叶子节点或者
            #L和R的值不相等,代表不是对称的,返回False
            if not L or not R or L.val != R.val:
                return False
            return is_recur(L.left, R.right) and is_recur(L.right, R.left)
        #递归判断左右子节点
        return is_recur(root.left, root.right)

该算法的时间复杂度和空间复杂度都是O(N)。