【leetcode hot 100】 二叉树2

1.

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:
    TreeNode* invertTree(TreeNode* root) {
        // 空节点或叶子节点直接返回
        if (root == nullptr) {
            return nullptr;
        }
        
        // 交换左右子树
        TreeNode* temp = root->left;
        root->left = root->right;
        root->right = temp;
        
        // 递归翻转左右子树
        invertTree(root->left);
        invertTree(root->right);
        
        return root;
    }
};

二叉树翻转(镜像)详解:递归一行思维吃透

这道题本质非常简单,但它是理解递归操作树结构的关键模板题。

核心只有一句话:

把每个节点的左右子树交换


一、代码在做什么

cpp 复制代码
TreeNode* invertTree(TreeNode* root) {
    if (root == nullptr) {
        return nullptr;
    }
    
    TreeNode* temp = root->left;
    root->left = root->right;
    root->right = temp;
    
    invertTree(root->left);
    invertTree(root->right);
    
    return root;
}

逻辑非常标准,可以拆成三步。


二、递归三步理解

第一步:终止条件

复制代码
if (root == nullptr) return nullptr;

空节点不用处理


第二步:当前节点做什么

复制代码
swap(root->left, root->right);

把左右子树交换(你用 temp 写法也完全正确)


第三步:递归子树

复制代码
invertTree(root->left);
invertTree(root->right);

让左右子树也各自完成翻转


三、举个例子

原树:

复制代码
    4
   / \
  2   7
 / \ / \
1  3 6  9

翻转后:

复制代码
    4
   / \
  7   2
 / \ / \
9  6 3  1

本质就是每一层都左右对调


四、递归本质(重点)

这题最重要的是理解:

你只负责"当前节点交换",子树交给递归处理

也就是说:

  • 你不用管整棵树怎么翻

  • 你只管这一层

  • 剩下的递归会帮你完成


五、时间和空间复杂度

时间复杂度:

O(n),每个节点访问一次

空间复杂度:

O(h),递归深度


六、非递归写法(层序遍历)

也可以用队列做 BFS:

cpp 复制代码
TreeNode* invertTree(TreeNode* root) {
    if (!root) return root;
    
    queue<TreeNode*> q;
    q.push(root);
    
    while (!q.empty()) {
        TreeNode* node = q.front(); q.pop();
        swap(node->left, node->right);
        
        if (node->left) q.push(node->left);
        if (node->right) q.push(node->right);
    }
    
    return root;
}

七、一句话总结

翻转二叉树 = 每个节点交换左右子树 + 递归处理子树


2.

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;
        return isMirror(root->left, root->right);
    }
    
private:
    bool isMirror(TreeNode* left, TreeNode* right) {
        // 两个都为空,对称
        if (left == nullptr && right == nullptr) return true;
        // 一个为空一个不为空,不对称
        if (left == nullptr || right == nullptr) return false;
        // 值不相等,不对称
        if (left->val != right->val) return false;
        
        // 递归检查:左的左 vs 右的右,左的右 vs 右的左
        return isMirror(left->left, right->right) && 
               isMirror(left->right, right->left);
    }
};

对称二叉树详解:镜像递归一眼看透

这道题是二叉树递归的经典题,核心思想其实非常统一:

判断两棵子树是否"镜像对称"


一、题目本质

一棵树是对称的,本质就是:

左子树 和 右子树 互为镜像

也就是:

  • 左的左 = 右的右

  • 左的右 = 右的左


二、代码在做什么

cpp 复制代码
bool isSymmetric(TreeNode* root) {
    if (root == nullptr) return true;
    return isMirror(root->left, root->right);
}

从根节点开始,比较左右子树


核心函数:

复制代码
bool isMirror(TreeNode* left, TreeNode* right)

判断两棵树是否互为镜像


三、递归核心逻辑

可以理解为四步:


第一步:都为空 → 对称

第二步:一个空一个不空 → 不对称

第三步:值不同 → 不对称

第四步:递归判断"镜像结构"

左.left 对比 右.right

左.right 对比 右.left


四、举个例子

对称树:

复制代码
    1
   / \
  2   2
 / \ / \
3  4 4  3

判断过程:

  • 2 和 2 ✔

  • 3 和 3 ✔

  • 4 和 4 ✔

最终返回 true


不对称:

复制代码
    1
   / \
  2   2
   \   \
   3    3

左右结构不匹配 → false


五、递归本质(重点)

这题的核心思想是:

把"整棵树对称"转化为"两个子树是否镜像"

你不需要关心整棵树,只需要定义:

函数 isMirror(left, right)

剩下的递归会帮你完成。


六、时间和空间复杂度

时间复杂度:

O(n),每个节点访问一次

空间复杂度:

O(h),递归深度


七、非递归写法(队列)

也可以用队列做:


八、一句话总结

对称二叉树 = 判断左右子树是否镜像(交叉递归)

相关推荐
2601_949950634 小时前
练题簿在线免费刷题 从资料整理到考前自测
面试·职场和发展·pdf·word·刷题
hetao17338375 小时前
2026-10-03~04 hetao1733837 的刷题记录
c++·算法
Zootopia6266 小时前
飞行力学知识梳理1|飞行性能与稳定性
人工智能·python·算法·机器学习·无人机·学习方法·信息与通信
longlongzihan6 小时前
从LeetCode 70. 爬楼梯看动态规划:如何精准推导状态转移方程?
c++·算法·leetcode·动态规划
2601_960356387 小时前
2027校招采购岗解析:数学基础如何迁移到需求预测、成本与供应商分析
人工智能·算法
h_a_o777oah7 小时前
【树论】树链剖分:将树形结构转化为线性结构以处理树上路径问题(洛谷 P3384 附C++代码模板)
数据结构·算法·线段树·acm·树链剖分·树论·重链剖分
HEJOO97 小时前
指针的算术运算详解
java·数据结构·算法
Coder-magician7 小时前
《代码随想录》刷题打卡day47:并查集-part01
数据结构·算法·图论
lsc_blog7 小时前
远程和居家办公的经历,技术简历上怎么摆
面试·职场和发展·重构·pdf·求职招聘
垆边人似月.7 小时前
VLAN 资源池(100~200 分档)
数据结构·算法