day143—递归—对称二叉树(LeetCode-101)

题目描述

给你一个二叉树的根节点 root , 检查它是否轴对称。

示例 1:

复制代码
输入:root = [1,2,2,3,4,4,3]
输出:true

示例 2:

复制代码
输入:root = [1,2,2,null,3,null,3]
输出:false

提示:

  • 树中节点数目在范围 [1, 1000]
  • -100 <= Node.val <= 100

解决方案:

这段代码的核心功能是判断一棵二叉树是否为对称二叉树 (即二叉树的左子树和右子树互为镜像),复用了 "判断两棵树是否相同" 的逻辑,将 "对称判断" 转化为 "左子树与右子树是否镜像相同",采用递归实现,时间复杂度 O(n)n 为节点数),空间复杂度 O(h)h 为树的高度),是该问题的经典简洁解法。

核心逻辑

代码的核心思路是 "对称 = 左子树与右子树镜像相同",通过复用 isSameTree 函数实现,关键是把 "镜像对比" 转化为 "两棵树的对比":

  1. 复用判断相同树的逻辑isSameTree 函数负责校验两棵树是否节点值、结构完全一致(前序递归,先校验当前节点,再递归校验左右子节点);
  2. 对称判断的转化 :判断二叉树对称,等价于判断 "根节点的左子树" 和 "根节点的右子树" 是否满足 "镜像相同"------ 而 isSameTree(root->left, root->right) 恰好完成这个校验(因为 isSameTree 会逐节点对比 root->left 的左子节点与 root->right 的左子节点、root->left 的右子节点与 root->right 的右子节点,这正是镜像对称的要求);
  3. 边界处理 :若根节点为空,root->leftroot->right 均为空,isSameTree 会返回 true,符合 "空树是对称的" 逻辑。

总结

  1. 核心思路:将 "对称二叉树判断" 转化为 "左子树和右子树是否相同" 的问题,复用已有逻辑,简化代码;
  2. 关键等价性:对称二叉树的本质是「左子树与右子树镜像全等」,而 isSameTree(root->left, root->right) 恰好完成这种镜像校验;
  3. 效率特点:与判断相同树的效率一致,每个节点仅遍历一次,时间 O(n),递归栈空间取决于树的高度,是最优解法之一。

函数源码:

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 isSameTree(TreeNode* p, TreeNode* q) {
        if(p==nullptr || q==nullptr){
            return p==q;
        }
        return q->val==p->val && isSameTree(p->left,q->right) && isSameTree(p->right,q->left);
    }
    bool isSymmetric(TreeNode* root) {
        return isSameTree(root->left,root->right);
    }
};
相关推荐
张欣-男17 分钟前
3分钟理解线性代数
线性代数·算法
白狐_79821 分钟前
408 数据结构|外部排序优化:怎么减少时间开销
数据结构·算法
小白说大模型21 分钟前
Hermes 全配置指南:从裸版到 AI Agent 天花板
大数据·人工智能·学习·算法·机器学习·数据挖掘
a1879272183132 分钟前
【算法】动态规划入门:从打家劫舍到状态设计的三堂课
算法·leetcode·动态规划·dp·回溯·暴力
淡海水10 小时前
07-04-并发-ConcurrentBag-T-工作窃取WorkStealing算法
开发语言·算法·c#·bag·concurrent·workstealing
leobertlan10 小时前
好玩系列:训练一个神经网络模型指导小孩玩游戏2-大局观教练
算法
Tisfy11 小时前
LeetCode 3876.构造奇偶一致的数组 II:三种情况分类讨论(其实还是脑筋急转弯)
算法·leetcode·题解·脑筋急转弯
乐迪信息12 小时前
智慧港口船舶AI算法实现在线状态监测
大数据·人工智能·深度学习·算法·计算机视觉
kiracrimson13 小时前
从缓存的角度看链表与线性表的差异
数据结构·链表·缓存
木井巳14 小时前
【BFS/DFS 解决 FloodFill 算法】太平洋大西洋水流问题
java·算法·leetcode·深度优先·广度优先·宽度优先·推荐算法