【二叉树】LC 101.对称二叉树

文章目录

前言

本专栏文章为《LeetCode 热题 100》的刷题题解,相关内容如有侵权,立即删除。

一、题目

1、原题链接

101.对称二叉树

2、题目描述

二、个人思路整理

1、思路分析

递归解法(时间复杂度O(n) 、空间复杂度O(h))

判断两棵树是否互为镜像对称:

  1. 判断根节点是否相等;
  2. 判断外侧节点(左子树的左节点与右子树的右节点)和内侧节点(左子树的右节点与右子树的左节点)是否相等。

复杂度分析

  • 时间复杂度: O ( n ) \mathcal{O}(n) O(n),其中 n n n 为节点总数,每个节点最多被遍历一次。
  • 空间复杂度: O ( h ) \mathcal{O}(h) O(h),其中 h h h 为树的高度,递归栈深度取决于树高。

迭代解法(空间复杂度O(n)、时间复杂度O(w))

也可以利用队列,将递归写法改写为迭代写法。

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),遍历所有节点。
  • 空间复杂度: O ( w ) O(w) O(w),队列中最多保存树中节点较多那一层的节点数(即树的最大宽度 w w w)。

2、解题代码

递归解法(时间复杂度O(n) 、空间复杂度O(h))

cpp 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    // 判断是否镜像对称
    bool check(TreeNode* l, TreeNode* r) {
        // 两节点均为空,对称
        if (l == nullptr && r == nullptr) {
            return true;
        }
        // 只有一个节点为空,不对称
        if (l == nullptr || r == nullptr) {
            return false;
        }
        // 都不为空,但值不同,不对称
        if (l->val != r->val) {
            return false;
        }
        // 如果两节点均非空且值相同,则递归判断其左、右子树
        // 镜像条件,需同时满足外侧与内侧条件:
        // 1.外侧:左子树的左节点与右子树的右节点相同
        // 2.内侧:左子树右节点与右子树的左节点相同
        return check(l->left, r->right) && check(l->right, r->left);
    }
    bool isSymmetric(TreeNode* root) {
        if(root == nullptr) {
            return true;
        }
        return check(root->left, root->right);
    }
};

迭代解法(空间复杂度O(n)、时间复杂度O(w))

cpp 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if(root == nullptr) {
            return true;
        }
        queue<TreeNode*> q;
        q.push(root->left);
        q.push(root->right);
        while(!q.empty()) {
            TreeNode* l = q.front();
            q.pop();
            TreeNode* r = q.front();
            q.pop();
            // 递归方法类似判断条件
            if (l == nullptr && r == nullptr) {
                continue;
            }
            if (l == nullptr || r == nullptr) {
                return false;
            }
            if (l->val != r->val) {
                return false;
            }
            //处理外侧
            q.push(l->left);
            q.push(r->right);
            //处理内侧
            q.push(l->right);
            q.push(r->left);
        }
        return true;
    }
};

三、知识风暴

  • DFS和BFS
相关推荐
sel_94 分钟前
【PEFT】参数高效微调(PEFT)技术详解:从原理到 LoRA/QLoRA 实战
人工智能·python·深度学习·算法·机器学习·参数高效微调
我星期八休息14 分钟前
Linux I/O多路转接—epoll
java·linux·运维·服务器·开发语言·jvm·算法
阳明山水1 小时前
Mamba与两阶段XGBoost的融合架构:面向间歇性需求的双路径预测框架
人工智能·深度学习·算法·机器学习·架构
水上冰石1 小时前
【MuJoCo从入门到精通】第2章 第一个 MuJoCo 仿真
前端·人工智能·算法
wenyq71 小时前
LeetCode 2904. Shortest and Lexicographically Smallest Beautiful String
算法·leetcode
维克兜率天2 小时前
【维克】技术指标是什么:从均线到MACD的数学原理
人工智能·笔记·python·算法·量化
Messy create2 小时前
【储能系统三大核心】
网络·stm32·单片机·算法·能源
sel_92 小时前
【vLLM】vLLM 推理框架详解:从 PagedAttention 到生产级部署实战
人工智能·深度学习·算法·语言模型·框架·vllm
XR1234567882 小时前
办公大楼组网选型决策树:TCO 与三大品牌优劣对比总结
算法·决策树·机器学习
阳明山水2 小时前
Mamba路径如何建模长程时序依赖
人工智能·深度学习·算法·机器学习·架构