题⽬描述

操作给定的⼆叉树,将其变换为源⼆叉树的镜像。

⼆叉树的镜像定义:源⼆叉树

思路及解答

递归

采用后序遍历(左-右-根)的方式递归访问每个节点:

  1. 递归处理左子树
  2. 递归处理右子树
  3. 访问根节点并交换其左右子树
public TreeNode mirrorTree(TreeNode root) {
if (root == null) return null;
// 先递归处理子树
TreeNode left = mirrorTree(root.left);
TreeNode right = mirrorTree(root.right);
// 再交换左右子树
root.left = right;
root.right = left;
return root;
}

或者采用前序遍历(根-左-右)的方式递归访问每个节点:

  1. 访问根节点并交换其左右子树
  2. 递归处理左子树
  3. 递归处理右子树
public TreeNode mirrorTree(TreeNode root) {
if (root == null) {
return null;
}
// 交换左右子树
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
// 递归处理左右子树
mirrorTree(root.left);
mirrorTree(root.right);
return root;
}
  • 时间复杂度​:O(n),每个节点只被访问一次
  • 空间复杂度​:O(h),h为树的高度,递归栈空间消耗

迭代

利用队列实现广度优先搜索(BFS):

  1. 将根节点加入队列
  2. 取出队首节点并交换其左右子树
  3. 将非空的左右子节点加入队列
  4. 重复直到队列为空
public TreeNode mirrorTree(TreeNode root) {
if (root == null) return null;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
TreeNode node = queue.poll();
// 交换左右子树
swap(node);
// 将子节点加入队列
if (node.left != null) queue.offer(node.left);
if (node.right != null) queue.offer(node.right);
}
return root;
} public void swap(TreeNode root) {
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
}
  • 时间复杂度​:O(n)
  • 空间复杂度​:O(n),最坏情况下需要存储所有节点

剑指offer-18、⼆叉树的镜像的更多相关文章

  1. 剑指Offer 18. 二叉树的镜像 (二叉树)

    题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ ...

  2. [剑指Offer]27-二叉树的镜像

    题目链接 https://www.nowcoder.com/practice/564f4c26aa584921bc75623e48ca3011?tpId=13&tqId=11171&t ...

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

    题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5 [思路1 ...

  4. 《剑指offer》 二叉树的镜像

    本题来自<剑指offer>二叉树的镜像 题目: 操作给定的二叉树,将其变换为源二叉树的镜像. 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 ...

  5. [剑指 Offer 18. 删除链表的节点]

    [剑指 Offer 18. 删除链表的节点] 给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点. 返回删除后的链表的头节点. 注意:此题对比原题有改动 示例 1: 输入: head ...

  6. 力扣 - 剑指 Offer 27. 二叉树的镜像

    题目 剑指 Offer 27. 二叉树的镜像 思路1(递归) 我们可以使用深度优先搜索,先递归到链表的末尾,然后从末尾开始两两交换.就相当于后续遍历而已 记得要先保存下来node.right节点,因为 ...

  7. 【剑指Offer】二叉树的镜像 解题报告(Python)

    [剑指Offer]二叉树的镜像 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-interviews 题 ...

  8. 【Java】 剑指offer(18) 删除链表中重复的结点

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 在一个排序的链表中,如何删除重复的结点?例如,在图3.4(a)中重 ...

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

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

  10. Go语言实现:【剑指offer】二叉树的镜像

    该题目来源于牛客网<剑指offer>专题. 操作给定的二叉树,将其变换为源二叉树的镜像. 示例: 输入: 4 / 2 7 / \ / 1 3 6 9 输出: 4 / 7 2 / \ / 9 ...

随机推荐

  1. JAVA的Toolkit显示图片问题

    Image image = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/20220204.png" ...

  2. setAttr和getPara() 用法注意~

    在一个新增的add.html 需要把一个参数传给save后台方法.这个参数是从别的页面获得的,需要setAttr才能在add.html看到值. 如果想再从后台拿到该值必须,与数据库的对应字段名称一样才 ...

  3. C/C++将切片数据列表转换为二维数组形式

    Slice2Matrix 本文档将以切片数据为例介绍读入文本格式数据,并将一维属性值写为二维阵列的过程. 实际工区中的切片常常是不规则的,因此在将其转换为二维阵列的过程中,需将切片填充为一个规则的矩形 ...

  4. base64编码文件下载

    比方说,我有一个bse64如下的编码文件: const base64Str = "UEsDBBQABgAIAAAAIQAykW9XZgEAAKUFAAATAAgCW0NvbnRlbnRfVH ...

  5. 前端开发系列048-基础篇之Vue的基础指令

    本文介绍Vue框架中涉及的基础指令. 一.基础指令 简单总结下Vue中常用的基础指令. v-html 设置标签的innerHTML v-text 设置标签的innerText v-bind 设置标签的 ...

  6. spring官方的配置文件获取

    简介 spring以配置文件IOC(控制翻转)AOP(切面) IOC控制翻转, 以配置文件来控制对象的生成. 参考连接 https://github.com/spring-projects/sprin ...

  7. 简单 屏蔽 assert

    简介 屏蔽 assert 如何实现 Makefile 中加 CFLAGS += -DNDEBUG 或者 gcc -DNDEBUG

  8. ICEE-SPI-debug最好用 SPI 和 JTAG 或更优的(高达104MHz的)SPI通信保障飞速的debug响应;不再像UART的115200 BaudRate ~

    S25FL032P : 32-Mbit CMOS 3.0 Volt Flash Memory with 104-MHz SPI (Serial Peripheral Interface) Multi ...

  9. Windows修改自动更新的时间

    文字流程 Win+R输入 regedit 输入路径 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings 在空白处右键 ...

  10. 纸稿草的 Iew_Trebla

    2025.7.25 CF1270H 说不出话了