1.递归--DFS(后序遍历)
思路:后序遍历,不断递归交换当前节点的左右孩子位置即可,从后往前换
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* mirrorTree(TreeNode* root) {
if(root==NULL)return NULL;
mirrorTree(root->left);
mirrorTree(root->right);
TreeNode *temp=root->right;//中间变量
root->right=root->left;
root->left=temp;
return root;
}
};
执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:8.9 MB, 在所有 C++ 提交中击败了90.68%的用户
2.递归2(简化版)使用swap节省了两行代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* mirrorTree(TreeNode* root) {
if(root==NULL)return NULL;
mirrorTree(root->left);
mirrorTree(root->right);
swap(root->left,root->right);
return root;
}
};
执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:8.9 MB, 在所有 C++ 提交中击败了87.19%的用户
tips:swap可以放在if的后一句,此时变成了先序遍历
之前想到一个问题,就是先交换当前节点的左右孩子,那原来的左孩子A变成了右孩子,此时A的左右孩子还是原来的那个左右孩子吗
后面发现我想多了,还是原来的左右孩子
3.层次遍历--BFS(借助队列实现)
每个节点中(父节点)左(左孩子)右(右孩子)按顺序入队,在while循环中依次弹出每个节点
因为他是按顺序放进去的,如样例
root = [4,2,7,1,3,6,9],按这样的顺序放进队列,所以我们依次从队列弹出所有节点就相当于从第一层开始逐渐把每一层遍历完
不想用swap的话也可以像法一那样做设置一个中间变量
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* mirrorTree(TreeNode* root) {
if(root==NULL)return NULL;
queue<TreeNode*>q;
q.push(root);
while(!q.empty()){
TreeNode* temp=q.front();
swap(temp->left,temp->right);
if(temp->left)q.push(temp->left);
if(temp->right)q.push(temp->right);
q.pop();
}
return root;
}
};
执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:8.8 MB, 在所有 C++ 提交中击败了92.43%的用户
4.把队列换成栈
注意事项:出队的代码必须写在前面,否则就是死循环
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* mirrorTree(TreeNode* root) {
if(root==NULL)return NULL;
stack<TreeNode*>s;
s.push(root);
while(!s.empty()){
TreeNode* temp=s.top();
s.pop();//注意这里和队列实现不同,不能写在左右孩子入队后,为什么,你想想就知道了
if(temp->left)s.push(temp->left);
if(temp->right)s.push(temp->right);
swap(temp->left,temp->right);
}
return root;
}
};