【LeetCode】剑指 Offer 27. 二叉树的镜像

文章目录

  • 【LeetCode】剑指 Offer 27. 二叉树的镜像
  • 一、递归法
  • 二、辅助栈(或队列)


一、递归法

根据二叉树镜像的定义,考虑递归遍历(DFS)二叉树,交换每个结点的左/右子结点,即可生成二叉树的镜像

递归解析:

  1. 终止条件:当结点 root 为空时(即越过叶结点),则返回 null
  2. 递推工作:
    1. 初始化结点 tmp,用于暂存 root 的左子结点
    2. 开启递归右子结点 mirrotTree(root.right),并将返回值作为 root 的左子结点
    3. 开启递归左子结点 mirrorTree(tmp),并将返回值作为 root 的右子结点
  3. 返回值:返回当前结点 root
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
class Solution {public TreeNode mirrorTree(TreeNode root) {if(root == null) return null;TreeNode temp = root.left;root.left = mirrorTree(root.right);root.right = mirrorTree(temp);return root;}
}
  • 时间复杂度 O(n),其中 n 为二叉树的结点数量,建立二叉树镜像需要遍历树的所有结点,占用 O(n) 时间
  • 空间复杂度 O(n),最差情况下(当二叉树退化为链表),递归时系统需使用 O(n) 大小的栈空间

二、辅助栈(或队列)

  • 利用栈(或队列)遍历树的所有结点 node,并交换每个 node 的左/右子结点

算法流程:

  1. 特例处理:当 root 为空时,直接返回 null
  2. 初始化:栈(或队列),本文用栈,并加入根结点 root
  3. 循环交换:当栈 stack 为空时跳出
    1. 出栈:记为 node
    2. 添加子结点:将 node 左和右子结点入栈
    3. 交换:交换 node 的左/右子结点
  4. 返回值:返回根结点 root
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
class Solution {public TreeNode mirrorTree(TreeNode root) {if(root == null) return null;Stack<TreeNode> stack = new Stack<>();stack.add(root);while(!stack.isEmpty()){TreeNode node = stack.pop();if(node.left != null) stack.add(node.left);if(node.right != null) stack.add(node.right);TreeNode temp = node.left;node.left = node.right;node.right = temp;}return root;}
}
  • 时间复杂度 O(n),其中 n 为二叉树的结点数量,建立二叉树镜像需要遍历树的所有结点,占用 O(n) 时间
  • 空间复杂度 O(n),如下图所示,最差情况下,栈 stack 最多同时存储 (n+1)/ 2 个结点。占用 O(n) 额外空间

【LeetCode】剑指 Offer 27. 二叉树的镜像相关推荐

  1. 《LeetCode力扣练习》剑指 Offer 27. 二叉树的镜像 Java

    <LeetCode力扣练习>剑指 Offer 27. 二叉树的镜像 Java 一.资源 题目: 请完成一个函数,输入一个二叉树,该函数输出它的镜像. 例如输入: 4 / 2 7 / \ / ...

  2. 算法leetcode|剑指 Offer 27. 二叉树的镜像|226. 翻转二叉树(rust很强)

    文章目录 剑指 Offer 27. 二叉树的镜像|226. 翻转二叉树: 样例 1: 限制: 分析 题解 rust go c++ java python 原题传送门:https://leetcode. ...

  3. JZ27 [剑指 Offer 27] 二叉树的镜像

    二叉树的镜像 Category Difficulty Likes Dislikes lcof Easy (79.61%) 311 - 请完成一个函数,输入一个二叉树,该函数输出它的镜像. 例如输入: ...

  4. 【Java】 剑指offer(27) 二叉树的镜像

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 请完成一个函数,输入一个二叉树,该函数输出它的镜像. 思路 画图可 ...

  5. 剑指offer 27. 二叉树的镜像

    声明:本系列博客是对何海涛<剑指offer>的关键点总结. 1.树的镜像 定义:树的根结点相同,但是左右两个子节点交换了位置 2.解题思路 1)前序遍历树的每一个结点: 2)如果遍历到的节 ...

  6. 剑指offer——27.二叉树的镜像

    题目: 操作给定的二叉树,将其变换为源二叉树的镜像. 知识点: 无 注意: 无 代码实现: 遍历所有节点,交换当前节点的左右子节点,递归至叶子节点 /*二叉树镜像*/ void mirror(Bina ...

  7. 剑指Offer 27—二叉树的镜像

    题意 请完成一个函数,输入一个二叉树,该函数输出它的镜像. 力扣 法1-递归 二叉树镜像定义: 对于二叉树中任意节点 root ,设其左 / 右子节点分别为 left, right:则在二叉树的镜像中 ...

  8. 剑指 Offer 27. 二叉树的镜像【无取巧解法,易于理解!】

    看题解时,很多大牛用很少的代码就完成了AC,但可能看了很多遍也看不懂,因此萌生了写一种最"笨"最完整的代码的想法,这样大家可以通过我的代码入门,看懂了再去挑战大牛们的简洁解法. 请 ...

  9. 剑指offer 27 二叉树的镜像

    请完成一个函数,输入一个二叉树,该函数输出它的镜像. 例如输入: 4 / 2 7 / \ / 1 3 6 9 镜像输出: 4 / 7 2 / \ / 9 6 3 1 示例 1: 输入:root = [ ...

最新文章

  1. Deep Learning论文笔记之(二)Sparse Filtering稀疏滤波
  2. MATLAB数字信号处理函数
  3. wtl for duilib 运行良好
  4. Python3 实现单例设计模式
  5. python相对路径下的shell_shell,python获取当前路径(脚本的当前路径) (aso项目记录)...
  6. 和为S(51Nod-2518)
  7. jRating五星评级
  8. chrome无法拖拽离线安装CRX格式插件解决方法
  9. matlab 下的集成学习工具箱
  10. BroadcastReceiver 用于接收广播
  11. 可视化驱动治理:公共交通系统的可视化实践
  12. 《高级无线网络—4G技术》——2.3 正交频分复用
  13. 最小生成树 POJ - 3522(枚举边最小生成树)
  14. 全局 快捷键_表格快捷键
  15. NeurIPS 2021 | Garment4D: 从点云序列中重建衣物
  16. SQL Server数据库 - 安装教程
  17. CSS Bulma 框架
  18. 柏力纪德:网店开店之后怎么运营
  19. python人工智能面试题爱奇艺面试题_经典算法题:爱奇艺研发工程师算法笔试题...
  20. Python批量格式化文件名为000xxx.jpg

热门文章

  1. java se开发_JAVA_SE基础——3.Java程序的开发流程
  2. bootstrap table 表格支持shirt 多选_bootstrap-table 表格行内编辑实现
  3. 钉钉机器人自动推送股票信息
  4. vue中使用百度地图,悬浮窗搜索功能
  5. bzoj 4260 REBXOR —— Trie树
  6. Linux监控命令之==sar
  7. 今天闲着没事弄个几个表情包
  8. 深入理解Java类加载器(2)
  9. 洛谷P1080 国王游戏
  10. oracle连接总结(内连接、外连接、自然连接,交叉连接,自连接)