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;
    }
};

总结

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

相关推荐
WBluuue7 分钟前
Codeforces 1076 Div3(ABCDEFG)
c++·算法
BackCatK Chen11 分钟前
第 1 篇:软件视角扫盲|TMC2240 软件核心特性 + 学习路径(附工具清单)
c语言·stm32·单片机·学习·电机驱动·保姆级教程·tmc2240
u01092727118 分钟前
模板编译期排序算法
开发语言·c++·算法
m0_6860416134 分钟前
C++中的适配器模式变体
开发语言·c++·算法
恒者走天下38 分钟前
cpp c++辅导星球价格调整
c++
梵刹古音1 小时前
【C语言】 格式控制符与输入输出函数
c语言·开发语言·嵌入式
rainbow68891 小时前
VSCode配置C/C++环境全攻略
c++
VekiSon1 小时前
Linux内核驱动——基础概念与开发环境搭建
linux·运维·服务器·c语言·arm开发
naruto_lnq1 小时前
C++中的桥接模式
开发语言·c++·算法
无限进步_1 小时前
面试题 02.02. 返回倒数第 k 个节点 - 题解与详细分析
c语言·开发语言·数据结构·git·链表·github·visual studio