Leetcode每日一题2021.2.28第101题:对称二叉树

题目描述

在这里插入图片描述

示例

在这里插入图片描述

方法一:递归

思路和算法

如果一个树的左子树与右子树镜像对称,那么这个树是对称的。
如果同时满足下面的条件,两个树互为镜像:

  • 它们的两个根节点具有相同的值
  • 每个树的右子树都与另一个树的左子树镜像对称

在这里插入图片描述
我们可以实现这样一个递归函数,通过【同步移动】两个指针的方法来遍历这棵树,p指针和q指针一开始都指向这棵树的根,随后p右移时,q左移;p左移时,q右移。每次检查当前p和q节点的值是否相等,如果相等再判断左右子树是否对称。

代码
# 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: TreeNode) -> bool:
        def check(p, q):
            if p is None and q is None:
                return True
            if p is None or q is None:
                return False

            return p.val == q.val and check(p.left, q.right) and check(p.right, q.left)

        return check(root, root)

方法二:迭代

思路和算法

首先,我们引入一个队列,这是把递归程序改写成迭代程序的常用方法。
初始化时,我们把根节点入队两次。每次提取两个节点并比较它们的值(队列中每两个连续的节点应该是相等的,而且它们的子树互为镜像),然后将两个节点的左右子节点按相反的顺序插入队列中。当队列为空时,或者我们检测到树不对称(即从队列中取出两个不相等的连续节点)时,该算法结束。

代码
# 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: TreeNode) -> bool:
        # 如果根节点为空,或者根节点的左子节点和右子节点同时为空时
        # 一定对称
        if not root or not (root.left or root.right):
            return True

        # 用队列保存节点
        queue = [root.left, root.right]

        while queue:
            # 从队列中取出两个节点,再比较这两个节点
            left = queue.pop(0)
            right = queue.pop(0)

            # 如果两个节点都为空就继续循环,两者有一个为空就返回False
            if not (left or right):
                continue
            if not (left and right):
                return False
            if left.val != right.val:
                return False

            # 将左节点的左孩子、右节点的右孩子放入队列
            queue.append(left.left)
            queue.append(right.right)

            # 将左节点的右孩子、右节点的左孩子放入队列
            queue.append(left.right)
            queue.append(right.left)

        return True
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值