题目及分析
操作给定的二叉树,将其变换为源二叉树的镜像。
分析:就是将二叉树的所有左右子树节点交换过来就可以了
思路(2种)
这里思路可以有以下两种
- 在原有的树上直接将所有左右子树节点交换
- 重新遍历生成一颗树,这棵树刚好是原来的镜像
代码(2个)
1. 在原有的树上直接将所有左右子树节点交换
递归的方法很是简便,但是需要注意的是在有些地方会ac不了,毕竟很耗内存
/*
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 *t = pRoot->left;
pRoot->left = pRoot->right;
pRoot->right = t;
//递归
Mirror(pRoot->left);
Mirror(pRoot->right);
}
};
2. 重新遍历生成一颗树,这棵树刚好是原来的镜像
这里采用层次遍历的方法:代码里又十分详细的注释
/*
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) return;
// 创建队列,并将原始树的所有元素推入队列
queue<TreeNode*> qtree;
qtree.push(pRoot);
// 层次遍历树,每次拿出队列的第一个节点
while(!qtree.empty()){
// 算出树中的节点数
int len = qtree.size();
while(len--){
// 取出队列的第一个节点
TreeNode *node = qtree.front();
qtree.pop();
// 将其左右子树推入队列
if(node->left){
qtree.push(node->left);
}
if(node->right){
qtree.push(node->right);
}
// 交换树的左子树右子树节点
TreeNode *t = node->left;
node->left = node->right;
node->right = t;
}
}
}
};