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

LeetCode:二叉树的中序遍历

1、题目描述

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

示例 1:

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

示例 2:

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

示例 3:

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

提示:

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

  • -100 <= Node.val <= 100

进阶: 递归算法很简单,你可以通过迭代算法完成吗?

2、方法1:迭代

迭代法通过显式地使用栈来模拟递归的隐式栈调用,避免了递归可能导致的栈溢出问题。

步骤:

  1. 初始化:创建一个空栈和一个空列表用于存储遍历结果。从根节点开始遍历。

  2. 遍历左子树

    • 将当前节点及其所有左子节点依次压入栈中,直到左子节点为空。

  3. 访问节点

    • 弹出栈顶节点(当前最左节点),将其值加入结果列表。

  4. 遍历右子树

    • 转向当前节点的右子节点,重复上述过程。

  5. 终止条件:当栈为空且当前节点为空时,遍历结束。

public List<Integer> inorderTraversal(TreeNode root) {List<Integer> list = new ArrayList<>();Stack<TreeNode> stack = new Stack<>();TreeNode current = root;while (current != null || !stack.isEmpty()) {// 遍历左子树while (current != null) {stack.push(current);current = current.left;}// 访问节点current = stack.pop();list.add(current.val);// 遍历右子树current = current.right;}return list;
}

 时间复杂度:O(n),空间复杂度:O(n)(栈空间)

3、方法2:递归

递归法直接利用函数的调用栈来实现中序遍历,代码简洁但可能因递归深度过大导致栈溢出。

步骤:

  1. 递归终止条件:当前节点为空时,直接返回。

  2. 递归左子树:对当前节点的左子节点调用递归函数。

  3. 访问节点:将当前节点的值加入结果列表。

  4. 递归右子树:对当前节点的右子节点调用递归函数。

public List<Integer> inorderTraversal(TreeNode root) {List<Integer> list = new ArrayList<>();middleTree(root, list);return list;
}public void middleTree(TreeNode node, List list) {if (node == null) return;middleTree(node.left, list);  // 递归左子树list.add(node.val);           // 访问节点middleTree(node.right, list); // 递归右子树
}

 时间复杂度:O(n),空间复杂度:O(n)(调用栈)

http://www.dtcms.com/a/175022.html

相关文章:

  • 【SpringBoot】SpringBoot中使用AOP实现日志记录功能
  • [HOT 100] 2646. 最小化旅行的价格总和
  • 前景理论——AI与思维模型【95】
  • 量子跃迁:破解未来计算的“时空密码”​
  • 分库分表后复杂查询的应对之道:基于DTS实时性ES宽表构建技术实践
  • enum4linux:渗透测试中的Windows信息收割机!全参数详细教程!Kali Linux教程!
  • Cursor 被封解决方案
  • MySQL 常用函数分类
  • Leetcode 刷题记录 08 —— 链表第二弹
  • LeetCode 热题 100 279. 完全平方数
  • 【Spring Boot 注解】@SpringBootApplication
  • homebrew安装配置Python(MAC版)
  • “wsl --install -d Ubuntu-22.04”下载慢,中国地区离线安装 Ubuntu 22.04 WSL方法(亲测2025年5月6日)
  • 网络安全等级保护有关工作事项[2025]
  • 网工实验——静态路由与BFD联动
  • 如何将本地 Jar 包安装到 Maven 仓库(以 Aspose 为例)
  • vue3 computed方法使用详细讲解
  • MUSIQ ,MANIQA,CLIP-IQA,FID是什么指标,分别是如何计算的(图像恢复领域评价指标
  • sqli-labs靶场通关保姆级教学(Get传输篇)Less-1Less-10
  • Python 10天冲刺 《元编程(Meta-programming)》
  • 《Python星球日记》第33天:前后端分离与 RESTful API
  • RPM打包格式spec文件设计原理与关键特性说明
  • 2. H264编码
  • 跨境电商合规新时代:亚马逊AHR风控系统深度解析与应对指南
  • 视觉爬虫开发:通过Puppeteer截图+CV定位动态元素坐标
  • 【iOS】源码阅读(二)——NSObject的alloc源码
  • ECMAScript 6(ES6):JavaScript 现代化的革命性升级
  • 1、Kafka与消息队列核心原理详解
  • 【技术追踪】通过潜在扩散和先验知识增强时空疾病进展模型(MICCAI-2024)
  • 如何分析java对象占用内存大小