python实现对称二叉树的判断
考虑问题
1. 什么是对称二叉树?
以根节点为对称轴,左子树与右子树对称
2. 对称二叉树的结点有什么特点?
以右根左的顺序遍历左子树,以左根右的顺序遍历右子树,每次访问的结点值相等。
3. 代码逻辑是什么?
3.1 首先我们判断左根结点的值是否等于右根结点的值,如果不等,可以直接返回false(递归的终止条件)。
3.2 如果左右根结点的值相等,从外侧到内侧的顺序判断左右子树的结点值是否相等。(如果左子树是左侧结点,那么右子树就是右侧结点)外侧和内侧需要用到两个递归。
3.3 同3.1,如果不等直接返回。(还需要考虑结点值有非空或者空的情况)
3.4 直到左右子树的所有结点都被访问一遍。(递归从左右根节点进去 然后 出来)
代码实现
class Solution:
def isSymmetric(self, root: Optional[TreeNode]) -> bool:
sign = True
sign = self.sym(root.left, root.right, sign) # 判断左子树和右子树是否对称
return sign
def sym(self, root1, root2, sign):
if sign: # 如果已经不对称了,就不需要再判断了
if root1 != None and root2 != None:
# 注意:这里必须是判断值是否相等,因为left和right不相等,所以不能直接判断结点是否相等。
if root1.val == root2.val:
# 判断外侧结点是否对称
sign = self.sym(root1.left, root2.right, sign)
# 判断内侧结点是否对称
sign = self.sym(root1.right, root2.left, sign)
else:
sign = False # 左右子树的结点值不相等时
elif root1 == None and root2 == None:
pass # 左右结点为空时
else:
sign = False # 左右结点有一个不为空时
return sign
注意
- 由于结点的left和right存储的值不同,因此不能通过判断结点判断对称,而应该是用结点值(val)。判断左右子树相等和左右子树对称是不一样的。
- 节点为空的时候,是无法通过.val获得值的,所以需要单独考虑结点都为空时。而且对称二叉树的左右子树结点可以都为空,但不能一个为空,一个不为空。
- 当有一个结点值不相等时,就认为这个二叉树是不对称的,可以直接返回false。