力扣题目101:对称二叉树

作者介绍:10年大厂数据\经营分析经验,现任大厂数据部门负责人。
会一些的技术:数据分析、算法、SQL、大数据相关、python
欢迎加入社区:码上找工作
作者专栏每日更新:
LeetCode解锁1000题: 打怪升级之旅
python数据分析可视化:企业实战案例
python源码解读
程序员必备的数学知识与应用
备注说明:方便大家阅读,统一使用python,带必要注释,公众号 数据分析螺丝钉 一起打怪升级

题目描述

给定一个二叉树,检查它是否是镜像对称的。

输入格式
  • root:二叉树的根节点。
输出格式
  • 返回布尔值,表示树是否对称。

示例

示例 1

输入:root = [1,2,2,3,4,4,3]
输出:True

示例 2

输入:root = [1,2,2,null,3,null,3]
输出:False


方法一:递归判断

解题步骤
  1. 基本情况:如果两个节点都是 None,返回 True;一个是 None 另一个不是,返回 False
  2. 比较节点:比较当前两节点的值,如果不相等,返回 False
  3. 递归比较:递归比较左子树的左孩子和右子树的右孩子,以及左子树的右孩子和右子树的左孩子。
Python 示例
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

def isSymmetric(root):
    """
    判断二叉树是否对称
    :param root: TreeNode, 二叉树的根节点
    :return: bool, 是否对称
    """
    def isMirror(left, right):
        if not left and not right:
            return True
        if not left or not right:
            return False
        return left.val == right.val and isMirror(left.left, right.right) and isMirror(left.right, right.left)
    
    return isMirror(root, root)

# 示例调用
root = TreeNode(1, TreeNode(2, TreeNode(3), TreeNode(4)), TreeNode(2, TreeNode(4), TreeNode(3)))
print(isSymmetric(root))  # 输出: True
算法分析
  • 时间复杂度:(O(n)),其中 (n) 是树中节点的数量,因为需要访问树中的每一个节点。
  • 空间复杂度:(O(h)),其中 (h) 是树的高度,空间消耗来自递归的栈空间。

方法二:迭代使用队列

解题步骤
  1. 初始化队列:将根节点的两份加入队列。
  2. 迭代比较:每次从队列中取出两个节点并比较它们。
  3. 子节点入队:如果节点相同,则将它们的子节点按对称顺序加入队列。
Python 示例
from collections import deque

def isSymmetric(root):
    """
    使用队列迭代判断二叉树是否对称
    :param root: TreeNode, 二叉树的根节点
    :return: bool, 是否对称
    """
    queue = deque([root, root])
    while queue:
        t1, t2 = queue.popleft(), queue.popleft()
        if not t1 and not t2:
            continue
        if not t1 or not t2 or t1.val != t2.val:
            return False
        queue.append(t1.left)
        queue.append(t2.right)
        queue.append(t1.right)
        queue.append(t2.left)
    return True

# 示例调用
root = TreeNode(1, TreeNode(2, None, TreeNode(3)), TreeNode(2, None, TreeNode(3)))
print(isSymmetric(root))  # 输出: False
算法分析
  • 时间复杂度:(O(n)),因为需要访问每个节点。
  • 空间复杂度:(O(n)),在最坏的情况下,队列中需要存储所有节点。

方法三:使用栈进行迭代

解题步骤
  1. 使用栈:将根节点的两份压入栈中。
  2. 迭代比较:从栈中弹出两个节点并进行比较。
  3. 子节点压栈:如果节点相同,则将它们的子节点按对称顺序压入栈中。
Python 示例
def isSymmetric(root):
    """
    使用栈迭代判断二叉树是否对称
    :param root: TreeNode, 二叉树的根节点
    :return: bool, 是否对称
    """
    if not root:
        return True
    stack = [(root.left, root.right)]
    while stack:
        left, right = stack.pop()
        if not left and not right:
            continue
        if not left or not right or left.val != right.val:
            return False
        stack.append((left.left, right.right))
        stack.append((left.right, right.left))
    return True

# 示例调用
root = TreeNode(1, TreeNode(2, None, TreeNode(3)), TreeNode(2, None, TreeNode(3)))
print(isSymmetric(root))  # 输出: False
算法分析
  • 时间复杂度:(O(n)),需要访问每个节点。
  • 空间复杂度:(O(n)),在最坏的情况下,栈中需要存储所有节点。

不同算法的优劣势对比

特征 方法一:递归 方法二:迭代队列 方法三:迭代栈
时间复杂度 (O(n)) (O(n)) (O(n))
空间复杂度 (O(h)) (O(n)) (O(n))
优势 易于实现 不使用递归 不使用递归
劣势 可能栈溢出 空间开销大 空间开销大

应用示例

这些方法可以用于计算机视觉中对象的对称性检测,软件测试中的树结构数据验证,或者在机器学习数据预处理中检查数据的对称性。

相关推荐

  1. 题目101:对称

    2024-05-10 18:24:02       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-10 18:24:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-10 18:24:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-05-10 18:24:02       82 阅读
  4. Python语言-面向对象

    2024-05-10 18:24:02       91 阅读

热门阅读

  1. 无人作业控制器--4G/5G通信

    2024-05-10 18:24:02       28 阅读
  2. unity中计算摄像机水平FOV的公式是什么

    2024-05-10 18:24:02       32 阅读
  3. docker-nginx目录宿主机映射

    2024-05-10 18:24:02       36 阅读
  4. web页面与原生android通信,调用原生android方法

    2024-05-10 18:24:02       30 阅读
  5. Linux系统入侵排查(三)

    2024-05-10 18:24:02       39 阅读
  6. docker容器 怎么查看运行日志

    2024-05-10 18:24:02       29 阅读
  7. Linux 常用命令

    2024-05-10 18:24:02       31 阅读
  8. TCP UDP

    TCP UDP

    2024-05-10 18:24:02      30 阅读
  9. 光伏发电消纳是什么意思?如何消纳?

    2024-05-10 18:24:02       30 阅读