剑指 Offer 27. 二叉树的镜像 题解
剑指 Offer 27. 二叉树的镜像 题解
解法1:递归
思路:
通过题目我们发现,二叉树的镜像就是通过交换原二叉树中所有结点的左子树和右子树变换而成的,因此我们就需要编码来实现这种交换过程。
递归到当前结点为NULL
时返回,实现函数swap
用于交换根结点的左右子树。
代码:
class Solution {
public:
TreeNode* mirrorTree(TreeNode* root) {
if(root == NULL) return NULL;
swap(root->left, root->right);
mirrorTree(root->left);
mirrorTree(root->right);
return root;
}
};
复杂度分析:
时间复杂度 :建立二叉树镜像需要遍历树的所有节点,需要 时间。
空间复杂度 :最差情况下(当二叉树退化为链表),递归时系统需使用 大小的栈空间。
解法2:栈迭代
思路:
循环结束条件是栈为空,利用栈结构,实现交换栈顶结点的左右子树。
代码:
class Solution {
public:
TreeNode* mirrorTree(TreeNode* root) {
stack<TreeNode*> s;
s.push(root);
while(!s.empty()) {
TreeNode* node = s.top();
s.pop();
if(node == NULL) continue;
swap(node->left, node->right);
s.push(node->left);
s.push(node->right);
}
return root;
}
};
复杂度分析:
时间复杂度 :建立二叉树镜像需要遍历树的所有节点,需要 时间
空间复杂度 :最差情况下(当为满二叉树时),栈最多同时存储 个节点,占用 额外空间