小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
判断二叉树是否对称
问题描述
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
示例:二叉树 [1, 2, 2, 3, 4, 4, 3] 是对称的,而二叉树[1, 2, 2, null, 3, null, 3] 则不是镜像对称的:
分析问题
首先,我们来看一下对称二叉树的定义。对称二叉树是指满足以下条件的二叉树:对于树中的任意两个对称节点L和R,一定有:
- L.val = R.val,即两个对称节点的值是相等的。
- L.left.val = R.right.val,即L的左子节点的值要和R的右子节点的值相等。
- L.right.val = R.left.val,即L的右子节点的值要和R的左子节点的值相等。
所以,我们可以从顶至底进行递归处理,然后判断每对节点是否对称,从而判断树是否为对称二叉树。
下面我们来看一下代码的实现。
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)。