BM33 二叉树的镜像
描述
操作给定的二叉树,将其变换为源二叉树的镜像。数据范围:二叉树的节点数 , 二叉树每个节点的值 要求: 空间复杂度 。本题也有原地操作,即空间复杂度 的解法,时间复杂度
比如:源二叉树
镜像二叉树
示例1
输入:
{8,6,10,5,7,9,11}
复制返回值:
{8,10,6,11,9,7,5}
复制说明:
如题面所示
示例2
输入:
{}
复制返回值:
{}
题解
递归实现
递归实现很简单,要将一个二叉树镜像反转,只需要将当前节点的左右节点互换,然后再递归对左右节点进行镜像反转即可。代码如下:
// 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;
}