题目描述:
操作给定的二叉树,将其变换为源二叉树的镜像。
1.在遍历树的同时交换节点的左右子节点
class Solution {
public:
void Mirror(TreeNode *pRoot) {
if(!pRoot) return;
TreeNode *node = pRoot->left;
pRoot->left = pRoot->right;
pRoot->right = node;
Mirror(pRoot->left);
Mirror(pRoot->right);
}
};
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
TreeNode* dfs(TreeNode *r) {
//判断是否为空
//关键字nullptr,等价于NULL的宏定义
//用指针交换左右孩子,最后处理根节点
if(!r) return nullptr;
TreeNode *lval = dfs(r->left);
TreeNode *rval = dfs(r->right);
r->left = rval;
r->right = lval;
return r;
}
void Mirror(TreeNode *pRoot) {
if(!pRoot) return;
dfs(pRoot);
}
};
//时间复杂度:O(n),n为树节点的个数。每个节点只用遍历一次,所以为O(n)
//空间复杂度:O(n), 每个节点都会在递归栈中存一次
2.非递归
只需要模拟一次树遍历,这里模拟树的层次遍历。
class Solution {
public:
void Mirror(TreeNode *pRoot) {
//定义一个队列,压入根节点
queue<TreeNode*> pq;
pq.push(pRoot);
while (!pq.empty()) {
int sz = pq.size();
while (sz--) {
TreeNode *node = pq.front();
pq.pop();
//判断左右孩子是否为空
if (node->left) pq.push(node->left);
if (node->right) pq.push(node->right);
// our tasks
TreeNode *cur = node->left; // 需要保存一下,交换位置
node->left = node->right;
node->right = cur;
} // end inner while
} // end outer while
}
};