思路:
题目的主要信息:
- 将二叉树镜像,即将其所有左右子树交换
我们可以考虑自底向上依次交换二叉树的左右结点。
方法一:递归
具体做法:
采用递归的方法,首先深入到二叉树的叶子结点,交换其左右,然后依次往上交换。
class Solution {
public:
TreeNode* Mirror(TreeNode* pRoot) {
if (pRoot == NULL) //空树返回
return NULL;
TreeNode* left = Mirror(pRoot->left); //先递归子树
TreeNode* right = Mirror(pRoot->right);
pRoot->left = right; //交换
pRoot->right = left;
return pRoot;
}
};复杂度分析:
- 时间复杂度:
,访问二叉树所有结点各一次
- 空间复杂度:
,递归栈最大值
方法二:栈
具体做法:
能够用递归的,我们也可以用栈来实现。栈的访问是一种自顶向下的访问,因此我们需要在左右子结点入栈后直接交换,然后再访问后续栈中内容。
class Solution {
public:
TreeNode* Mirror(TreeNode* pRoot) {
if(pRoot == NULL) //空树
return NULL;
stack<TreeNode*> s; //辅助栈
s.push(pRoot);
while (!s.empty())
{
TreeNode* node = s.top();
s.pop();
if (node->left != NULL) s.push(node->left);
if (node->right != NULL) s.push(node->right); //左右结点入栈
TreeNode* temp = node->left; //交换左右
node->left = node->right;
node->right = temp;
}
return pRoot;
}
};复杂度分析:
- 时间复杂度:
,每个结点遍历一次
- 空间复杂度:
,最坏情况下,栈的大小

京公网安备 11010502036488号