没有输出的输入是不完整的

0%

剑指offer-二叉树的镜像

本文为剑指 offer 系列第二十篇。
主要知识点为树,给定一棵树来构造它的镜像,用完美的递归逻辑和直观的层序遍历来解决这个问题。

题目描述

操作给定的二叉树,将其变换为源二叉树的镜像。
二叉树的镜像定义:源二叉树
8
/ \
6 10
/ \ / \
5 7 9 11
镜像二叉树
8
/ \
10 6
/ \ / \
11 9 7 5

解题思路

思路1

通过观察这个给定的样例可以发现,对于任何一个节点,都是左右子树进行了替换。原来的左子树变成了如今的右子树,而原来的右子树成为了如今的左子树。由于树的结构的特殊性,这就是一个完美的递归思路啊。

思路2

同样还是左右子树来进行替换,我们可以通过层序遍历来依次的获得需要将子树进行替换的节点,然后将子树进行替换。扩展一下,前序遍历中序遍历后序遍历应该都是可以的。

思路3

尝试一下前序遍历来进行替换。写完了我才发现,其实和思路1是相同的道理,只是我们将左右子树的替换单独拿了出来,替换部分其实就类似于我们遍历的时候的cout语句,殊途同归。

解题代码

思路1代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
void Mirror(TreeNode *root) {
// 方法1 递归
if(!root) return;
root = helper(root);
}
TreeNode* helper(TreeNode* root){
if(!root) return NULL;
TreeNode *temp = root->left;
root->left = helper(root -> right);
root->right = helper(temp);
return root;
}
};

时间复杂度为O(n),空间复杂度为O(n)

思路2代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
void Mirror(TreeNode *root) {
//方法二 层序遍历
if(!root) return;
queue<TreeNode*> q{{root}};
while(!q.empty()){
for(int i = q.size();i>0;i--){
TreeNode* a = q.front(); q.pop();
TreeNode* temp = a->left;
a->left = a->right;
a->right = temp;
if(a->left) q.push(a->left);
if(a->right) q.push(a->right);
}
}
}
};

时间复杂度为O(n),空间复杂度为O(n)

思路3代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
void Mirror(TreeNode *root) {
//方法3 前序遍历
if(!root) return;
root = preOrder(root);
}
TreeNode* preOrder(TreeNode* root){
if(!root)return NULL;
helper3(root);
if(root->left) preOrder(root->left);
if(root->right) preOrder(root->right);
return root;
}
void helper3(TreeNode* root){
TreeNode* temp = root->left;
root->left = root->right;
root->right = temp;
}

};

时间复杂度为O(n),空间复杂度为O(n)
以上,本题结束!