C/C++ BM33 二叉树的镜像

文章目录

前言

镜像说的好听,无非就是换下节点。


题目

操作给定的二叉树,将其变换为源二叉树的镜像。

数据范围:二叉树的节点数 0 ≤ n ≤ 1000 0≤n≤1000 0≤n≤1000, 二叉树每个节点的值 0 ≤ v a l ≤ 1000 0≤val≤1000 0≤val≤1000

要求: 空间复杂度 O ( n ) O(n) O(n) 。本题也有原地操作,即空间复杂度 O ( 1 ) O(1) O(1)的解法,时间复杂度 O ( n ) O(n) O(n)

源二叉树

镜像二叉树

输入:{8,6,10,5,7,9,11}

返回值:{8,10,6,11,9,7,5}

示例2

输入:{}

返回值:{}

解决方案一

1.1 思路阐述

这个镜像其实就是交换下左右子树的节点罢了。

树的问题还是一样:拆分。

将一棵树进行镜像实际上就是对除了根节点外的所有节点与同属于同一个父节点的兄弟节点交换。

这里我们考虑根节点的为空的特殊情况进行单独返回。

后面就是把根节点下面的两个子节点进行交换,这里交换使用了一个temp的变量。

交换,这里是交换子树,不仅仅是交换值这么简单。所以第一次交换完之后,其实是左右子树都交换了。

接着对左右子树做同样的操作,直到轮到叶子结点。

通俗来讲,就是一个递归调用。大树分左树和右树。

时间复杂度分析:

对于每个节点,函数执行一些固定的操作,例如交换左右子树的指针,并对左右子树进行递归调用。因此,对于具有 n 个节点的二叉树,每个节点的操作时间是常数时间,因此时间复杂度为 O(n)。

空间复杂度分析:

递归调用会在函数调用栈上占用空间。在最坏的情况下,递归深度等于树的高度,因此空间复杂度取决于树的高度。对于平衡二叉树,空间复杂度为 O(log n),其中 n 是节点数。对于不平衡的二叉树,空间复杂度可以达到 O(n),因为递归调用可能会一直延伸到树的最深处。

综上所述,时间复杂度为 O ( n ) O(n) O(n),空间复杂度在最坏的情况下为 O ( n ) O(n) O(n),在最好的情况下为 O ( l o g n ) O(log n) O(logn)。

1.2 源码

cpp 复制代码
/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param pRoot TreeNode类 
     * @return TreeNode类
     */

    TreeNode* Mirror(TreeNode* pRoot) {
        if (!pRoot)
            return nullptr;

        if(pRoot->left||pRoot->right)
        {
            TreeNode *temp=pRoot->left;
            pRoot->left=pRoot->right;
            pRoot->right=temp;
        }
        pRoot->left=Mirror(pRoot->left);
        pRoot->right=Mirror(pRoot->right);
        return pRoot;
    }
};

总结

看了下官方的题解,还有个是栈的,感觉差不多,这里就没贴了。思路都是一样的。

相关推荐
揽星河..3 小时前
【C语言】底层程序设计
c语言·开发语言
沫璃染墨3 小时前
从零入门计算机网络系列(十二):HTTP长连接与会话管理详解——从Connection到Cookie与Session
linux·服务器·c++·tcp/ip·ubuntu·http·交互
xiaoye-duck4 小时前
《C++ 项目:手写大模型接入 SDK》DeepSeek接口设计(下):流式响应实现和测试
开发语言·网络·c++·语言模型
旖旎夜光6 小时前
【C++ 基础入门】类和对象(上):封装、对象模型与 this 指针
开发语言·c++·笔记·学习
揽星河..6 小时前
【C语言】结构体
c语言·开发语言
小超人诞生日记6 小时前
C++ 智能指针的使用及其原理详解
c++·算法
唐青枫7 小时前
C 语言 malloc() 详解与实战 Demo
c语言
akinggw7 小时前
libagentcore - 一个基于c++的AI多agent系统升级到2.0版本
开发语言·jvm·c++
繁星蓝雨8 小时前
C++设计原理———多重继承(虚基类、菱形继承、委托、重命名、基类和成员初始化)
c++·委托·多重继承·mi·显式初始化列·虚基类·对象布局
旖旎夜光9 小时前
【C++ 基础入门】命名空间、输入输出、缺省参数与函数重载
开发语言·c++·笔记·学习