JZ27 二叉树的镜像

117 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 3 天,点击查看活动详情

Day29 2023/02/05

题目链接

难度:简单

题目

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

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

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

比如:

源二叉树

镜像二叉树

示例

输入:{8,6,10,5,7,9,11}
返回值:{8,10,6,11,9,7,5}
说明:实现了镜像操作

思路


根据二叉树镜像的形式,可以考虑使用递归的方式,从根结点开始,交换它左右子节点,同依次遍历交换每棵子树的左右节点。
具体步骤:

  1. 判断二叉树是否为空,若为空返回nullptr
  2. 交换左右子树
  3. 分别递归左子树和右子树
  4. 返回根节点

关键点


  • 递归法只要将一个大问题划分为若干相同的小问题,就基本做出来了。

算法实现


c++代码实现-递归法

/**
 * struct TreeNode {
 *  int val;
 *  struct TreeNode *left;
 *  struct TreeNode *right;
 *  TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
  public:
    TreeNode* Mirror(TreeNode* pRoot) {
        if (!pRoot) return pRoot; //判空操作
        swap(pRoot->left, pRoot->right); //交换左右子树
        Mirror(pRoot->left); //递归左子树
        Mirror(pRoot->right); //递归右子树
        return pRoot; //返回根节点
    }
};
  • 时间复杂度 O(n)O(n) --- 遍历整个二叉树,n为二叉树的节点数
  • 空间复杂度 O(1)O(1) --- 最坏情况下,二叉树为链表型,递归调用栈的深度为二叉树节点数n。

总结

  • 本题还可以使用辅助队列的方式,二叉树类的题目大多的解题思路就是递归法和使用辅助队列的形式。
  • 本题的进阶形式空间复杂度仅为O(1)O(1),有会的大佬可以评论一下!!!感激。