题目
操作给定的二叉树,将其变换为源二叉树的镜像。
解答
二叉树
递归
递归
这是自下而上的递归(后续遍历)
class Solution {
public:
void Mirror(TreeNode *pRoot) {
if(!pRoot) return;
Mirror(pRoot->left);
Mirror(pRoot->right);
TreeNode *tmp = nullptr;
tmp = pRoot->left;
pRoot->left = pRoot->right;
pRoot->right = tmp;
}
};
稍微修改,就变成了自上而下的递归(前序遍历)
但是这个占内存稍微大一点,不知道为啥。
class Solution {
public:
void Mirror(TreeNode *pRoot) {
if(!pRoot) return;
TreeNode *tmp = nullptr;
tmp = pRoot->left;
pRoot->left = pRoot->right;
pRoot->right = tmp;
Mirror(pRoot->left);
Mirror(pRoot->right);
}
};
这时很难不想到中序遍历,但是结果不对🤣
非递归
使用层次遍历。时间复杂度:O(n),n为树节点的个数。
应该也可以使用前序和后序吧,我没试过。
class Solution {
public:
void Mirror(TreeNode *pRoot) {
if(!pRoot) return;
queue<TreeNode *> Q;
Q.push(pRoot);
while(Q.size()){
TreeNode *p = Q.front();
if(p->left) Q.push(p->left);
if(p->right) Q.push(p->right);
TreeNode *tmp = p->left;
p->left = p->right;
p->right = tmp;
Q.pop();
}
}
};