​BM33 二叉树的镜像​

描述

操作给定的二叉树,将其变换为源二叉树的镜像。数据范围:二叉树的节点数 [二叉树]BM33 二叉树的镜像-简单_二叉树镜像反转 , 二叉树每个节点的值 [二叉树]BM33 二叉树的镜像-简单_二叉树_02要求: 空间复杂度 [二叉树]BM33 二叉树的镜像-简单_二叉树镜像反转_03 。本题也有原地操作,即空间复杂度 [二叉树]BM33 二叉树的镜像-简单_二叉树_04 的解法,时间复杂度 [二叉树]BM33 二叉树的镜像-简单_二叉树镜像反转_03

比如:源二叉树

[二叉树]BM33 二叉树的镜像-简单_二叉树_06

镜像二叉树

[二叉树]BM33 二叉树的镜像-简单_二叉树镜像反转_07

示例1

输入:

{8,6,10,5,7,9,11}

复制返回值:

{8,10,6,11,9,7,5}

复制说明:

如题面所示

示例2

输入:

{}

复制返回值:

{}

题解

递归实现

递归实现很简单,要将一个二叉树镜像反转,只需要将当前节点的左右节点互换,然后再递归对左右节点进行镜像反转即可。代码如下:

#include <bits/stdc++.h>

// https://www.nowcoder.com/practice/a9d0ecbacef9410ca97463e4a5c83be7?tpId=295&tags=&title=&difficulty=0&judgeStatus=0&rp=0&sourceUrl=%2Fexam%2Foj
struct TreeNode
{
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

TreeNode *Mirror(TreeNode *pRoot)
{
if (pRoot == nullptr)
{
return pRoot;
}

std::swap(pRoot->left, pRoot->right);
Mirror(pRoot->left);
Mirror(pRoot->right);
return pRoot;
}

非递归实现

非递归实现需要借助于栈的特性,步骤如下:

  • 1. 检查空节点的情况
  • 2. 将根结点入站
  • 3. 将栈顶元素出栈,交换栈顶左右指针的值,然后将其左右指针分别入站
  • 4. 重复上述过程,直到栈为空

注意:我们以前进行前序遍历的时候,是先将右结点入栈,然后再将左结点入站,目的是为了按照当前节点--左结点--右结点的顺序进行访问。但是这里只需要将左右节点进行交换,而不需要考虑访问的顺序,因此入栈的顺序是无所谓的。

代码如下:

TreeNode *Mirror(TreeNode *pRoot)
{
if (pRoot == nullptr)
{
return pRoot;
}

std::stack<TreeNode *> s;
s.push(pRoot);
s.pop();
while (!s.empty())
{
auto node = s.top();
std::swap(node->left, node->right);
if (node->left != nullptr)
{
s.push(node->left);
}

if (node->right != nullptr)
{
s.push(node->right);
}
}

return pRoot;
}