剑指 Offer 27. 二叉树的镜像

1、题目描述

2、算法分类 ---- 搜索与回溯

【搜索与回溯】是计算机解题中常用的算法,很多问题无法根据某种确定的计算法则来求解,可以利用搜索与回溯的技术求解。它的基本思想是:为了求得问题的解,先选择某一种可能情况向前探索,在探索过程中,一旦发现原来的选择是错误的,就退回一步重新选择,继续向前探索,如此反复进行,直至得到解或证明无解。

3、代码实现--方法一【递归与回溯】

  • 终止条件: 当节点 root 为空时(即越过叶节点),则返回 null ;
  • 进行交换
  • 开启递归的递推模式;
  •          开启递归 左子节点 mirrorTree(root.left)
  •          开启递归 右子节点 mirrorTree(root.right) 
  • 返回值: 返回当前节点 root;
class Solution {

    //方法一:
    public TreeNode mirrorTree(TreeNode root){
       if(root == null) return null;
 
       //进行交换
       TreeNode tempNode = root.left;
       root.left = root.right;
       root.right = tempNode;

       //进行递归
       mirrorTree(root.left);
       mirrorTree(root.right);
       return root;
   }
}

时间复杂度 O(N) : 其中 N 为二叉树的节点数量,建立二叉树镜像需要遍历树的所有节点,占用 O(N)时间。
空间复杂度 O(N): 最差情况下(当二叉树退化为链表),递归时系统需使用 O(N)大小的栈空间。

4、代码实现--方法二【辅助栈 / 队列】

  • 特例处理: 当 root 为空时,直接返回 null ;
  • 初始化: 栈(或队列),本文用栈,并加入根节点 root 。
  • 循环交换: 当栈 stack 为空时跳出;
  •         出栈: 记为 node ;
  •         添加子节点: 将 node左和右子节点入栈;
  •         交换: 交换 node 的左 / 右子节点。
  • 返回值: 返回根节点 root 。
class Solution {
 public TreeNode mirrorTree(TreeNode root){
       if(root == null) return null;
  
       //镜像是反向输出,因此用的Stack栈模式
       Stack<TreeNode> stack = new Stack<TreeNode>();
       stack.push(root);
       while(!stack.isEmpty()){
           TreeNode node = stack.pop();
           if(node.left != null)
               stack.push(node.left);
           if(node.right != null)
               stack.push(node.right);
           
           //进行交换
           TreeNode tempNode = node.left;
           node.left = node.right;
           node.right = tempNode;
       }
       return root;     
   }
}

时间复杂度 O(N) : 其中 N 为二叉树的节点数量,建立二叉树镜像需要遍历树的所有节点,占用 O(N)时间。
空间复杂度 O(N) : 如下图所示,最差情况下,栈 stack 最多同时存储 (N+1​ / 2 )个节点,占用 O(N) 额外空间

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值