LeetCode 剑指 Offer 27. 二叉树的镜像
请完成一个函数,输入一个二叉树,该函数输出它的镜像。
法一:递归:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* mirrorTree(TreeNode* root) {
if (root == nullptr) {
return nullptr;
}
swap(root->left, root->right);
mirrorTree(root->left);
mirrorTree(root->right);
return root;
}
};
时间复杂度为O(n),空间复杂度为O(n),当树退化为链表时为最差情况,此时需要n个栈空间,n为二叉树节点数。
法二:使用辅助栈代替函数栈,栈中记录下每个节点,每次取出一个节点交换其左右子树:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* mirrorTree(TreeNode* root) {
if (root == nullptr) {
return nullptr;
}
stack<TreeNode *> s;
s.push(root);
while (s.size()) {
TreeNode *node = s.top();
s.pop();
if (node->left) s.push(node->left);
if (node->right) s.push(node->right);
swap(node->left, node->right);
}
return root;
}
};
时间复杂度为O(n),空间复杂度为O(n),当树为满二叉树时情况最差,此时栈内存在n/2个元素,n为二叉树节点数。