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

[面试精选] 0094. 二叉树的中序遍历

文章目录

      • 1. 题目链接
      • 2. 题目描述
      • 3. 题目示例
      • 4. 解题思路
      • 5. 题解代码
      • 6. 复杂度分析

1. 题目链接


94. 二叉树的中序遍历 - 力扣(LeetCode)

2. 题目描述


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


3. 题目示例


示例 1 :

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

示例 2 :

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

4. 解题思路


  1. 颜色标记法
    • 使用颜色标记节点状态:1(未访问)、2(已访问)
    • 模拟递归栈的调用过程,但通过显式栈实现
  2. 栈操作顺序
    • 对于未访问节点(color=1),按"右-根-左"顺序入栈
    • 这样出栈顺序就是"左-根-右",符合中序遍历要求
  3. 关键点
    • 通过颜色标记避免重复处理
    • 显式栈替代递归调用栈
    • 空节点直接跳过

5. 题解代码


class Solution {// 辅助节点类,用于标记节点状态class Node {TreeNode node;  // 树节点int color;      // 颜色标记:1表示未访问,2表示已访问Node(TreeNode node, int color) {this.node = node;this.color = color;}}// 中序遍历方法public List<Integer> inorderTraversal(TreeNode root) {List<Integer> ans = new ArrayList<>();  // 存储遍历结果Deque<Node> stack = new LinkedList<>();  // 使用双端队列模拟栈// 空树直接返回if (root == null) return ans;// 初始状态:根节点标记为未访问stack.push(new Node(root, 1));while (!stack.isEmpty()) {Node cur = stack.pop();  // 弹出栈顶元素// 跳过空节点if (cur.node == null) continue;if (cur.color == 1) {  // 未访问节点// 按照"右-根-左"顺序入栈(出栈顺序为"左-根-右")stack.push(new Node(cur.node.right, 1));  // 右子节点(未访问)stack.push(new Node(cur.node, 2));        // 当前节点标记为已访问stack.push(new Node(cur.node.left, 1));   // 左子节点(未访问)} else {  // 已访问节点ans.add(cur.node.val);  // 添加到结果列表}}return ans;}
}

6. 复杂度分析


  1. 时间复杂度:O(n)
    • 每个节点被访问两次(入栈和出栈)
    • 但常数系数为2,仍为线性复杂度
  2. 空间复杂度:O(n)
    • 栈的最大深度等于树的高度
    • 最坏情况下(斜树)为O(n)
http://www.lqws.cn/news/217207.html

相关文章:

  • C++算法训练营 Day11 栈与队列(2)
  • 30、memory-order-relaxed
  • 求解一次最佳平方逼近多项式
  • 湖北理元理律师事务所:债务优化中的民生保障实践
  • LLM 笔记:Speculative Decoding 投机采样
  • C++动态分配内存知识点!
  • Redis主从复制原理二 之 主从复制工作流程
  • Java 中 synchronized 和 ReentrantLock 的全面对比解析
  • 一些因子的解释
  • 「Java基本语法」代码格式与注释规范
  • Redis 与 MySQL 数据一致性保障方案
  • sendDefaultImpl call timeout(rocketmq)
  • 什么是高考?高考的意义是啥?
  • Burp Suite 基础
  • 第三章支线二 ·函数幻阶:语法召唤与逻辑封印
  • 快捷键的记录
  • 6.7本日总结
  • 2023年ASOC SCI2区TOP,随机跟随蚁群优化算法RFACO,深度解析+性能实测
  • PCB设计教程【大师篇】——STM32开发板电源设计(电压基准、滤波电容)
  • 基于TarNet、CFRNet与DragonNet的深度因果推断模型全解析
  • 当SAP系统内计划订单转换为生产订单时发生了什么?
  • 使用 SAM + YOLO + ResNet 检测工业开关状态:从零到部署
  • 在 Java 中!(逻辑非)和 ||(逻辑或)的优先级关系
  • Qt(part 2)1、Qwindow(菜单栏,工具栏,状态栏),铆接部件,核心部件 ,2、添加资源文件 3、对话框
  • LINUX67 FTP 3客户服务系统;FTP 上传、下载测试调试
  • 从认识AI开始-----AutoEncoder:生成模型的起点
  • STM32开发,创建线程栈空间大小判断
  • 手拉手处理RuoYi脚手架常见文问题
  • 零基础在实践中学习网络安全-皮卡丘靶场(第十六期-SSRF模块)
  • 【C/C++】std::vector成员函数清单