题目描述:
请完成一个函数,输入一个二叉树,该函数输出它的镜像。
例如输入:
分析:
什么是一棵二叉树的镜像呢?
二叉树的镜像就是交换二叉树中每个节点的左右子树
。 需要交换每个节点的左右子树就需要遍历这棵树,在之前的博客中我们知道遍历一棵二叉树总共有两种思路:
- 递归
- 非递归(借助栈)
题解一:递归
在二叉树的学习中,我们会经常使用到递归,并且递归对于二叉树来说也是必不可少的。那我们就先来看看递归的解法。
思路很简单:
- 如果root为空,直接返回root
- root不为空:交换root的左右节点
- 继续递归root的左子树、右子树
代码:
class Solution {
public TreeNode mirrorTree(TreeNode root) {
if(root==null)
{
return root;
}
TreeNode tmp=root.left;
root.left=root.right;
root.right=tmp;
mirrorTree(root.left);
mirrorTree(root.right);
return root;
}
}
执行结果:
题解二:借助辅助栈
在二叉树的遍历中,非递归方式一般采取栈来实现,我们在解决二叉树镜像问题也需要借助辅助栈,因为我们需要把每个节点的左右子树保存在栈中,一方面是为了交换,另一方面是为了能够将整个二叉树遍历完。
步骤:
root 为空
:直接返回rootroot不为空
:将根节点入栈,循环执行以下操作:- 取栈顶元素:node=stack.peek();
- 并将栈顶元素从栈中删除
- 如果node有左孩子:左孩子入栈
- 如果node有右孩子:右孩子入栈
- 然后交换node的左右节点。
代码:
class Solution {
public TreeNode mirrorTree(TreeNode root) {
if(root==null)
{
return null;
}
//借助辅助栈
//先遍历左子树构造右子树
Stack<TreeNode> s=new Stack<>();
s.push(root);
while(!s.isEmpty())
{
TreeNode node = s.pop();
//如果有左孩子先让左孩子入栈,如果有右孩子再让右孩子入栈,然后交换
//左右孩子
if(node.left!=null)
{
s.push(node.left);
}
if(node.right!=null)
{
s.push(node.right);
}
//交换
TreeNode tmp=node.left;
node.left=node.right;
node.right=tmp;
}
return root;
}
}
执行结果: