剑指offer18_二叉树的镜像_题解
二叉树的镜像
题目描述
操作给定的二叉树,将其变换为源二叉树的镜像。
示例1
二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5
分析
方案一:递归
递归遍历二叉树,交换每个孩子的左右子节点,即可生成二叉树的镜像
/**
时间复杂度:O(n)
其中 N 为二叉树的节点数量,建立二叉树镜像需要遍历树的所有节点,占用 O(N) 时间。
空间复杂度:O(n)
最差情况下(当为满二叉树时),栈 stack 最多同时存储 N/2 个节点,占用 O(N) 额外空间。
**/
class Solution
{
public:
void Mirror(TreeNode *pRoot)
{
// 当节点 root 为空时(即越过叶节点),则返回 null
if (pRoot == NULL)
{
return;
}
// 交换根节点的左右孩子
swap(pRoot->left, pRoot->right);
// 递归对左子树进行镜像变换
Mirror(pRoot->left);
// 递归对右子树进行镜像变换
Mirror(pRoot->right);
}
};
方法二:迭代(利用队列实现)
利用栈(或队列)遍历树的所有节点,并交换每个节点的左右子节点。
class Solution
{
public:
void Mirror(TreeNode *root)
{
// 初始化队列,并加入根节点root
queue<TreeNode *> q;
q.push(root);
// 当队列q为空时跳出
while (!q.empty())
{
TreeNode *top = q.front();
q.pop(); //出队
// 添加左右子节点
if (top->left)
q.push(top->left);
if (top->right)
q.push(top->right);
// 交换左右子节点
swap(top->left, top->right);
}
}
};