【题目】
请完成一个函数,输入一个二叉树,该函数输出它的镜像。
来源:leetcode
链接:https://leetcode-cn.com/problems/er-cha-shu-de-jing-xiang-lcof/
例如:
输入:
4
/ \
2 7
/ \ / \
1 3 6 9
输出:
4
/ \
7 2
/ \ / \
9 6 3 1
【示例】
输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]
【限制】
0 <= 节点个数 <= 1000
【思路】
【代码】递归、栈模拟、队列模拟
【递归】
耗时:4ms 63.03%
内存:9.1MB 100%
1、利用二叉树的先序遍历NLR,先处理根节点,再处理左右节点。
2、边界条件是:当前节点为空NULL
3、具体操作:交换根节点的左右子树
class Solution {
public:
TreeNode* mirrorTree(TreeNode* root) {
if (root==NULL)
return NULL;
swap(root->left, root->right);
mirrorTree(root->left);
mirrorTree(root->right);
return root;
}
};
【栈】
耗时:0ms 100% 栈竟然比其他两种方式快这么多?!
内存:9.5MB 100%
1、先序递归转成用栈实现的非递归先序遍历
2、循环结束条件:栈为空
3、交换栈顶节点的左右子树
class Solution {
public:
TreeNode* mirrorTree(TreeNode* root) {
TreeNode* t;
stack<TreeNode*> s;
s.push(root);
while(!s.empty()){
t=s.top();
s.pop();
if(t==NULL)
continue;
swap(t->left,t->right);
s.push(t->left);
s.push(t->right);
}
return root;
}
};
【队列】
耗时:4ms 63.03%
内存:9.5MB 100%
我个人比较偏向与用队列作为辅助的层次遍历,个人觉得层次遍历可以解决90%的树类问题,还有10%是题目要求用递归或其他方式实现。万能的层次遍历!!!
1、用队列实现对树的层次遍历
2、循环结束条件:队列为空
3、交换队首节点的左右子树
class Solution {
public:
TreeNode* mirrorTree(TreeNode* root) {
TreeNode *head=root,*t,*left;
queue<TreeNode*> q;
q.push(root);
while(!q.empty()){
t=q.front();
q.pop();
if(t==NULL)
continue;
swap(t->left,t->right);
q.push(t->left);
q.push(t->right);
}
return head;
}
};