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

【Leetcode hot 100】94.二叉树的中序遍历

问题链接

94.二叉树的中序遍历

问题描述

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

示例 1:
在这里插入图片描述

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

示例 2:

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

示例 3:

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

提示

  • 树中节点数目在范围 [0, 100]
  • -100 <= Node.val <= 100

问题解答

二叉树的中序遍历顺序为:左子树 → 根节点 → 右子树。以下提供两种常见解法:递归(简单直观)和迭代(进阶要求)。

方法一:递归解法

递归是最直接的实现方式,利用递归栈的特性自然满足中序遍历的顺序。

import java.util.ArrayList;
import java.util.List;class Solution {public List<Integer> inorderTraversal(TreeNode root) {List<Integer> result = new ArrayList<>();// 调用递归辅助方法inorder(root, result);return result;}// 递归辅助函数:遍历当前节点,并将结果存入resultprivate void inorder(TreeNode node, List<Integer> result) {// 边界条件:若节点为空,直接返回if (node == null) {return;}// 1. 先遍历左子树inorder(node.left, result);// 2. 再访问当前节点(根节点)result.add(node.val);// 3. 最后遍历右子树inorder(node.right, result);}
}

思路解析

  • 递归函数 inorder 负责处理单个节点:先递归遍历左子树,再将当前节点的值加入结果列表,最后递归遍历右子树。
  • 终止条件:当节点为 null 时,递归结束(空树/叶子节点的子节点无需处理)。

方法二:迭代解法(栈实现)

迭代法通过显式使用栈模拟递归过程,避免递归调用的栈开销,更符合进阶要求。

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;class Solution {public List<Integer> inorderTraversal(TreeNode root) {List<Integer> result = new ArrayList<>();Stack<TreeNode> stack = new Stack<>();TreeNode cur = root; // 指针记录当前遍历的节点// 循环条件:当前节点不为空 或 栈不为空(还有节点未处理)while (cur != null || !stack.isEmpty()) {// 1. 先将所有左子节点入栈(直到最左侧节点)while (cur != null) {stack.push(cur);cur = cur.left; // 移动到左子节点}// 2. 弹出栈顶节点(此时左子树已处理完,该节点为当前子树的根节点)cur = stack.pop();result.add(cur.val); // 加入结果列表(处理根节点)// 3. 处理右子树cur = cur.right;}return result;}
}

思路解析

  • 使用 cur 指针追踪当前节点,先将所有左子节点依次入栈(确保左子树优先处理)。
  • cur 为空时,弹出栈顶节点(此时该节点的左子树已处理完),将其值加入结果列表,再将 cur 指向其右子节点(处理右子树)。
  • 循环直至 cur 为空且栈为空(所有节点处理完毕)。

复杂度分析

  • 时间复杂度:两种方法均为 O(n),其中 n 为二叉树节点数(每个节点恰好被访问一次)。
  • 空间复杂度
    • 递归解法:O(h)h 为树的高度,递归栈深度),最坏情况(链状树)为 O(n)
    • 迭代解法:O(h)(栈存储的节点数不超过树的高度),最坏情况为 O(n)

两种方法均能正确处理示例输入:

  • 示例1:root = [1,null,2,3] → 输出 [1,3,2]
  • 示例2:root = [] → 输出 []
  • 示例3:root = [1] → 输出 [1]

文章转载自:

http://LyeMySuq.hrydL.cn
http://fXbLFxxt.hrydL.cn
http://bBEaLMOI.hrydL.cn
http://21rDuRXN.hrydL.cn
http://7Z86TR7W.hrydL.cn
http://sMV7Rrmv.hrydL.cn
http://l9Vg3OMl.hrydL.cn
http://hcGPGxx8.hrydL.cn
http://F2vG1obU.hrydL.cn
http://lbIhSNta.hrydL.cn
http://CDYAbB5f.hrydL.cn
http://HMGAu5JX.hrydL.cn
http://JXIDltIi.hrydL.cn
http://INYUbVUW.hrydL.cn
http://HH2WRhZE.hrydL.cn
http://i1I0NlsE.hrydL.cn
http://bVV4Ups0.hrydL.cn
http://URRFdhpd.hrydL.cn
http://nexhQk6C.hrydL.cn
http://jG3PSjIR.hrydL.cn
http://ybUMX0UU.hrydL.cn
http://YLKYrdgz.hrydL.cn
http://gkL115hB.hrydL.cn
http://oSM5I64M.hrydL.cn
http://AMAY1chc.hrydL.cn
http://w3CY3aXf.hrydL.cn
http://uczs5b0p.hrydL.cn
http://ijcYUgOk.hrydL.cn
http://RgmNRnvU.hrydL.cn
http://VwoGNe2O.hrydL.cn
http://www.dtcms.com/a/377407.html

相关文章:

  • 渗透测试真的能发现系统漏洞吗
  • 【芯片设计-信号完整性 SI 学习 1.2 -- loopback 回环测试】
  • Android App瘦身方法介绍
  • MySQL修改字段类型避坑指南:如何应对数据截断与转换错误?
  • Linux权限以及常用热键集合
  • 成品油加油站综合监管迈入 “云时代”!智慧物联网涉税数据采集平台推行工作全面推进
  • c primer plus 第五章复习题和练习题
  • C++设计模式,高级开发,算法原理实战,系统设计与实战(视频教程)
  • Spring 统一功能处理
  • ES6基础入门教程(80问答)
  • 第3讲 机器学习入门指南
  • InnoDB 逻辑存储结构:好似 “小区管理” 得层级结构
  • copyparty 是一款使用单个 Python 文件实现的内网文件共享工具,具有跨平台、低资源占用等特点,适合需要本地化文件管理的场景
  • C# 哈希查找算法实操
  • 一个C#开发的Windows驱动程序管理工具!
  • 环境变量
  • Codeforces Round 1049 (Div. 2)
  • Eclipse下载安装图文教程(非常详细,适合新手)
  • vue2迁移到vite[保姆级教程]
  • 基于webpack的场景解决
  • Vite 中的 import.meta.env 与通用 process.env.NODE_ENV 的区别与最佳实践
  • 除了Webpack,还有哪些构建工具可以实现不同环境使用不同API地址?
  • sklearn聚类
  • I.MX6UL:汇编LED驱动实验
  • 计算机毕设 java 高校机房综合管控系统 基于 SSM+Vue 的高校机房管理平台 Java+MySQL 的设备与预约全流程系统
  • 设计模式-建造者观察者抽象工厂状态
  • 第5讲 机器学习生态构成
  • JAVA秋招面经
  • LVS群集
  • 半导体功率器件IGBT工艺全流程