/*
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 *p) {
if(!p) return;
auto tmp = p->left;
p->left = p->right;
p->right = tmp;
if(p->left) Mirror(p->left);
if(p->right) Mirror(p->right);
}
};
非递归解法:
为什么要强调非递归呢,因为往往面试官出的题,往往不能用非递归解,毕竟递归好理解,写起来有方便,区分不出人才,所以这时候就要掌握非递归解法了。
我的思路: 是将首个节点交换左右子树,后面直接将左右子树保存到队列中,然后一个一个取出来,依次进行上面的操作。代码如下。
class Solution {
public:
void Mirror(TreeNode *p) {
queue<TreeNode *> q;
if(!p) return ;
auto tmp = p;
while(tmp) {
swap(tmp->left, tmp->right);
if(tmp->left) q.push(tmp->left);
if(tmp->right) q.push(tmp->right);
if(!q.empty()){
tmp = q.front();
q.pop();
}
else // 这里不可省略
break;
}
return ;
}
};