leetcode-对称二叉树

101. 对称二叉树

题解:

首先我们要清楚,对称二叉树,比较的不是左右节点,而是根节点的左右子树是不是相互翻转的。比较的是两个树。就是说左子树的左节点和右子树的右节点做比较,左子树的右节点和右子树的左节点做比较。

我们使用递归方法。

1.递归函数的参数和返回值

前面已经说过了,比较的是两个树,自然是左子树和右子树节点

返回值是bool类型

compare(left, right)

2.终止条件

节点为空的情况

  • 左节点为空,右节点不为空,不对称,False
  • 左不为空,右为空,不对称,False
  • 左右都为空,True

节点不为空的情况

  • 左右都不为空,节点数值不相同,False

3.单层递归逻辑

  • 比较二叉树的外侧是否对称,传入的是左子树的左孩子,右子树的右节点
  • 比较二叉树的内侧是否对称,传入左节点的右孩子,右节点的左孩子
  • 左右都对称返回True,有一侧不对称返回False
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def isSymmetric(self, root: Optional[TreeNode]) -> bool:
        def compare(left, right):
            if not left and right:
                return False
            elif left and not right:
                return False
            elif not left and not right:
                return True
            elif left.val != right.val:
                return False
            outsides = compare(left.left, right.right)
            inside = compare(left.right, right.left)
            return outsides and inside
        if not root:
            return True
        return compare(root.left, root.right)

你可能感兴趣的:(leetcode)