当前位置: 首页 > news >正文

LeetCode:翻转二叉树

1、题目描述

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

示例 1:

输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]

示例 2:

输入:root = [2,1,3]
输出:[2,3,1]

示例 3:

输入:root = []
输出:[]

提示:

  • 树中节点数目范围在 [0, 100] 内

  • -100 <= Node.val <= 100

2、方法1:递归法

核心思想:采用分治思想,先处理子树再处理根节点

  1. 递归到最左叶子节点

  2. 递归到最右叶子节点

  3. 从底部开始逐层交换左右子树

  4. 最终返回完成翻转的根节点

public TreeNode invertTree(TreeNode root) {if(root == null) return null;invertTree(root.left);   // 递归翻转左子树invertTree(root.right);  // 递归翻转右子树swap(root);             // 交换当前节点的左右子节点return root;
}

复杂度分析

  • 时间复杂度:O(n) 每个节点访问一次

  • 空间复杂度:O(h) 递归栈空间(h为树高)

3、方法2:迭代法(层序遍历+队列)

核心思想:广度优先遍历,逐层交换节点

  1. 使用队列实现BFS(广度优先)遍历,逐层交换

  2. 每访问一个节点立即交换其左右子节点

  3. 子节点入队前已完成交换,保证后续正确处理

public TreeNode invertTree(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;
}

复杂度分析

  • 时间复杂度:O(n)

  • 空间复杂度:O(w) w为树的最大宽度

4、方法3:迭代法(后序遍历+栈)

核心思想:用栈模拟递归过程,显式控制遍历顺序

  1. 维护pre指针标记已访问的右子树

  2. 只有确保左右子树都访问后才执行交换

  3. 严格遵循左→右→根的处理顺序

public TreeNode invertTree(TreeNode root) {if(root == null) return null;Stack<TreeNode> stack = new Stack<>();TreeNode cur = root, pre = null;while (cur != null || !stack.isEmpty()){while (cur != null){stack.push(cur);cur = cur.left;}cur = stack.pop();if (cur.right == pre || cur.right == null){swap(cur);      // 后序位置交换pre = cur;cur = null;} else {stack.push(cur);cur = cur.right;}}return root;
}

复杂度分析

  • 时间复杂度:O(n)

  • 空间复杂度:O(h)

http://www.xdnf.cn/news/345889.html

相关文章:

  • DLMS协议 —— System title 详解(作用及结构一览)
  • C——操作符详解
  • 广州AI数字人:从“虚拟”走向“现实”的变革力量
  • HOW - 在 Mac 上的 Chrome 浏览器中调试 Windows 场景下的前端页面
  • 《React Native热更新实战:用Pushy打造无缝升级体验》
  • systemd vs crontab:Linux 自动化运行系统的全面对比
  • 深入理解栈数据结构(Java实现):从原理到实战应用
  • LeetCode[226] 翻转二叉树
  • 基于Qt开发的http/https客户端
  • 电子电气架构 --- 如何有助于提安全性并减少事故
  • FEKO许可限制
  • OpenCV 中用于背景分割的一个类cv::bgsegm::BackgroundSubtractorLSBP
  • 芯片笔记 - 手册参数注释
  • Spring Security(笔记)
  • 第37次CCF--机器人饲养
  • C语言自定义类型:联合与枚举详解
  • QT中的网络请求
  • Pycharm安装后打开提示:此应用无法在你的电脑上运行,若要找到合适于你的电脑的版本,请咨询发布者
  • 如何选择自己喜欢的cms
  • 【Unity中的数学】—— 四元数
  • 实时操作系统:航空电子系统的安全基石还是创新枷锁?
  • std::iota(C++)
  • 年龄估计数据集
  • 【工具推荐】Code2Prompt
  • 【HarmonyOS 5】鸿蒙页面和组件生命周期函数
  • 【软件设计师:软件工程】11.项目管理
  • C++算法(19):整数类型极值,从INT_MIN原理到跨平台开发实战
  • java每日精进 5.08【框架之数据权限补充】
  • DRAM详解
  • macOS Arduino IDE离线安装ESP8266支持包