剑指offer-18、⼆叉树的镜像

题⽬描述

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

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

思路及解答

递归

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

  1. 递归处理左子树
  2. 递归处理右子树
  3. 访问根节点并交换其左右子树
java 复制代码
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. 递归处理右子树
java 复制代码
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. 重复直到队列为空
java 复制代码
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),最坏情况下需要存储所有节点
相关推荐
何中应24 分钟前
如何使用Spring Context实现消息队列
java·后端·spring
四念处茫茫28 分钟前
Rust:与JSON、TOML等格式的集成
java·rust·json
摸鱼仙人~28 分钟前
一文深入学习Java动态代理-JDK动态代理和CGLIB
java·开发语言·学习
微知语35 分钟前
Cell 与 RefCell:Rust 内部可变性的双生子解析
java·前端·rust
雨过天晴而后无语1 小时前
Windchill10+html使用Lightbox轻量化wizard的配置
java·前端·html
Yeniden1 小时前
设计模式>原型模式大白话讲解:就像复印机,拿个原件一复印,就得到一模一样的新东西
java·设计模式·原型模式·1024程序员节
披着羊皮不是狼1 小时前
HTTP 与 API 入门:理解前后端交互原理
java·网络协议·http·交互
2401_841495641 小时前
【操作系统】模拟真实操作系统核心功能的Java实现
java·操作系统·进程管理·系统调用·并发控制·中断处理·cpu调度
程序员皮皮林2 小时前
Java 25 正式发布:更简洁、更高效、更现代!
java·开发语言·python
好家伙VCC2 小时前
**发散创新:AI绘画编程探索与实践**随着人工智能技术的飞速发展,AI绘
java·人工智能·python·ai作画