101. 对称二叉树

问题描述

https://leetcode.cn/problems/symmetric-tree/description/

解题思路

这个题,一看就是递归。既然如此,我们按照递归的一般思路来看,即问题的定义即为问题的解。

这个题目看似复杂,实际就是在求左子树的左孩子等于右子树的右孩子,左子树的右孩子等于右子树的左孩子。

我们给出了定义,那代码就迎刃而解了。

其实还有一种思路。我们可以把左子树或者右子树反转。反转之后判断左子树是否等于右子树即可。

代码一、纯递归定义

# 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:
        if root is None:
            return True
        return self.is_same(root.left, root.right)
    
    def is_same(self, p, q):
        if p is None and q is None:
            return True
        if p is None or q is None:
            return False
        if p.val == q.val:
            return self.is_same(p.left, q.right) and self.is_same(p.right, q.left)
        return 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:
        if root is None:
            return True
        self.reverse(root.right)
        return self.is_same(root.left, root.right)

    def is_same(self, p, q):
        if p is None and q is None:
            return True
        if p is None or q is None:
            return False
        if p.val == q.val:
            return self.is_same(p.left, q.left) and self.is_same(p.right, q.right)
        return False

    def reverse(self, root):
        if not root:
            return
        root.left, root.right = root.right, root.left
        self.reverse(root.left)
        self.reverse(root.right)

 

posted @ 2023-01-28 15:21  BJFU-VTH  阅读(15)  评论(0编辑  收藏  举报