剑指 Offer 27:二叉树的镜像(两种解法)

题目描述:

请完成一个函数,输入一个二叉树,该函数输出它的镜像。

例如输入:
4/     2       7/ \   / 1   3 6   9镜像输出:

分析:
什么是一棵二叉树的镜像呢?
二叉树的镜像就是交换二叉树中每个节点的左右子树 需要交换每个节点的左右子树就需要遍历这棵树,在之前的博客中我们知道遍历一棵二叉树总共有两种思路:

  • 递归
  • 非递归(借助栈)

题解一:递归
在二叉树的学习中,我们会经常使用到递归,并且递归对于二叉树来说也是必不可少的。那我们就先来看看递归的解法。

思路很简单:

  • 如果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 为空:直接返回root
  • root不为空:将根节点入栈,循环执行以下操作:
    • 取栈顶元素: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;
    }
}

执行结果:
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值