剑指Offer 28. 【对称】的二叉树(Easy)/ 二叉树问题!!!

剑指Offer 28. 【对称】的二叉树

在这里插入图片描述
【题目链接】

  1. 对称的二叉树(递归,清晰图解)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    ### 1212 递归(44 ms,14.9 MB)
    def isSymmetric(self, root: TreeNode) -> bool:
        def recur(L, R):
            # 终止条件:若当前左、右子节点均为空,表示二者对称,返回True
            if not L and not R: return True
            
            # 若只有左子节点为空 或 只有右子节点为空 或 左、右子节点不相等,则此(子)树不对称,返回False
            if not L or not R or L.val != R.val: return False

            # 若当前左、右子节点对称,则继续递归判断下面的左、右子树是否对称
            return recur(L.left, R.right) and recur(L.right, R.left)

        return  recur(root.left, root.right) if root else True # 若根节点为空,则直接返回True,否则开始递归判断

	### 0122 迭代(36 ms,15.1 MB)
    def isSymmetric(self, root: TreeNode) -> bool:
        # 若根节点为空,则对称(or 根节点的左右子树均为空)
        if not root:
            return True

        # 先存放根节点的左、右子树
        queue = [root.left, root.right]
        while queue:
            # 左、右子树依次出队
            l = queue.pop(0)
            r = queue.pop(0)

            # 若两棵子树均为空,则对称
            if not l and not r:
                continue
            # 若只有其中一棵子树为空 or 当前对称两个节点的值不相等,则不对称
            elif not l or not r or l.val != r.val:
                return False
            
            # 左、右子树对称配对入栈_1
            queue.append(l.left)
            queue.append(r.right)

            # 左、右子树对称配对入栈_2
            queue.append(l.right)
            queue.append(r.left)
        
        return True # 若所有对称节点都匹配,则是对称树

	### 0122 递归(36 ms,15.2 MB)
    def isSymmetric(self, root: TreeNode) -> bool:
        if not root:
            return True

        def dfs(l, r):
            if not l and not r:
                return True
            elif not l or not r or l.val != r.val:
                return False

            # 继续判断左、右子树是否对称
            return dfs(l.left, r.right) and dfs(l.right, r.left)

        return dfs(root.left, root.right)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值