题目描述
操作给定的二叉树,将其变换为源二叉树的镜像。
输入描述:
二叉树的镜像定义:源二叉树
8
/ \
6 10
/ \ / \
5 7 9 11
镜像二叉树
8
/ \
10 6
/ \ / \
11 9 7 5
完整代码
基本思想
采用后序遍历的方式构造一棵镜像二叉树
- 先构造左子树
- 再构造右子树
- 将构造的左子树连接在根节点的右子树上,将构造的右子树连接在根节点的左子树上
/*
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 *pRoot) {
if(pRoot==NULL)
return;
pRoot=build(pRoot);
}
private:
TreeNode* build(TreeNode* root){
if(root==NULL)
return root;
TreeNode *left=build(root->left);
TreeNode *right=build(root->right);
root->left=right;
root->right=left;
return root;
}
};
解法二
直接在原树上镜像
- 先将根节点的右子树镜像,镜像完连接在左子树上
- 再将根节点的左子树镜像,镜像完连接在右子树上
/*
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 *pRoot) {
if(pRoot == NULL)
return;
TreeNode *temp;
//1.先将二叉树的右子树镜像
Mirror(pRoot->right);
temp = pRoot->left;//需要暂存左子树的指针
//将镜像后的右子树链接在左子树上
pRoot->left = pRoot->right;
//2.将二叉树的左子树镜像
Mirror(temp);
//将镜像后的二叉树链接在右子树上
pRoot->right = temp;
}
};
剑指offer思想
基本思想:采用先序遍历的思想进行镜像
- 先交换根节点的左右子树
- 再将根节点的左子树、右子树镜像
递归上述过程
/*
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 *pRoot) {
if(pRoot == NULL)
return;
TreeNode* temp = pRoot->left;
pRoot->left = pRoot->right;
pRoot->right = temp;
Mirror(pRoot->left);
Mirror(pRoot->right);
}
};
来源:CSDN
作者:qq_31672701
链接:https://blog.csdn.net/qq_31672701/article/details/103984343