递归写法1
原地修改。
swap替换那三句也是阔以滴。
class Solution {
public:
TreeNode* mirrorTree(TreeNode* root)
{
if(!root) return NULL;
TreeNode*temp=root->left;
root->left=root->right;
root->right=temp;
if(root->left)
mirrorTree(root->left);
if(root->right)
mirrorTree(root->right);
return root;
}
};
递归写法2
这样写费点空间啊。
class Solution {
public:
TreeNode* mirrorTree(TreeNode* root)
{
if(!root) return NULL;
TreeNode*res=new TreeNode(root->val);
res->left=mirrorTree(root->right);
res->right=mirrorTree(root->left);
return res;
}
};
利用栈
class Solution {
public:
TreeNode* mirrorTree(TreeNode* root)
{
if(!root) return NULL;
stack<TreeNode*>s;
s.push(root);
while(!s.empty()) {
TreeNode*temp=s.top();
s.pop();
if(!temp) continue;
swap(temp->left,temp->right);
s.push(temp->left);
s.push(temp->right);
}
return root;
}
};
if continue语句是为了避免空指针问题。
看下图:
利用队列
跟辅助栈区别就是,它是先进先出
class Solution {
public:
TreeNode* mirrorTree(TreeNode* root) {
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
TreeNode* node = q.front();
q.pop();
if (node == NULL) {
continue;
}
swap(node->left, node->right);
q.push(node->left);
q.push(node->right);
}
return root;
}
};