LeetCode 94. 二叉树的中序遍历

94. 二叉树的中序遍历

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

示例 1:

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

输出:[1,3,2]

示例 2:

输入:root = []

输出:[]

示例 3:

输入:root = [1]

输出:[1]

提示:

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

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

解法思路:

1、递归(Recursion)

2、迭代维护栈(Iterator)

3、Morris 中序遍历(了解一下)

Morris 遍历算法是另一种遍历二叉树的方法,它能将非递归的中序遍历空间复杂度降为 O(1)

Morris 遍历算法步骤(假设当前遍历到的节点为 x):

  • 若 x 无左孩子
    • x 加入结果
    • x = x.right
  • 若 x 有左孩子,找 x 左子树的最右边的节点 predecessor
    • predecessor 右孩子为空,右孩子指向x,x = x.left
    • predecessor 右孩子不为空,x 加入结果,x = x.right
  • 重复上述步骤,直到访问完整棵树

法一:

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public List<Integer> inorderTraversal(TreeNode root) {// Recursion// Time: O(n)// Space: O(n)List<Integer> res = new ArrayList<>();inorder(root, res);return res;}private void inorder(TreeNode root, List<Integer> res) {if (root == null) return;inorder(root.left, res);res.add(root.val);inorder(root.right, res);}
}

法二:

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public List<Integer> inorderTraversal(TreeNode root) {// Iterator// Time: O(n)// Space: O(n)List<Integer> res = new ArrayList<>();Deque<TreeNode> stack = new ArrayDeque<>();while (root != null || !stack.isEmpty()) {while (root != null) {stack.addLast(root);root = root.left;}root = stack.removeLast();res.add(root.val);root = root.right;}return res;}
}

法三: 

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public List<Integer> inorderTraversal(TreeNode root) {// Morris// Time: O(n)// Space: O(1)// Morris 遍历算法步骤(假设当前遍历到的节点为 x):// 若 x 无左孩子//      x 加入结果//      x = x.right// 若 x 有左孩子,找 x 左子树的最右边的节点 predecessor//      predecessor 右孩子为空,右孩子指向x,x = x.left//      predecessor 右孩子不为空,x 加入结果,x = x.right// 重复上述步骤,直到访问完整棵树List<Integer> res = new ArrayList<>();TreeNode predecessor = null;while (root != null) {if (root.left != null) {// predecessor 节点就是当前 root 节点向左走一步,然后一直向右走至无法走为止predecessor = root.left;while (predecessor.right != null && predecessor.right != root) {predecessor = predecessor.right;}// 让 predecessor 的右指针指向 root,继续遍历左子树if (predecessor.right == null) {predecessor.right = root;root = root.left;} else { // 说明左子树已经访问完了,需要断开链接res.add(root.val);predecessor.right = null;root = root.right;}} else {res.add(root.val);root = root.right;}}return res;}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/610647.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL】数据库的设计

数据库设计 1、多表关系 一对多(多对一)&#xff1a;在多的一方建立外键&#xff0c;指向一的一方的主键。多对多&#xff1a;多对多关系实现需要借助第三张中间表。中间表至少包含两个字段&#xff0c;这两个字段作为第三张表的外键&#xff0c;分别指向两张表的主键一对一&…

企业级进销存管理系统

框架&#xff1a; 进销存管理系统&#xff0c;采用SpringBootShiroMyBatisEasyUI 项目采用Maven构建&#xff0c;数据库文件存放在 sql/jxc.sql 截图 运行项目部分截图&#xff0c; 登录界面&#xff0c;用户名admin&#xff0c;密码admin123 当前库存查询&#xff0c; 进…

搭建Eureka服务注册中心

一、前言 我们在别的章节中已经详细讲解过eureka注册中心的作用&#xff0c;本节会简单讲解eureka作用&#xff0c;侧重注册中心的搭建。 Eureka作为服务注册中心可以进行服务注册和服务发现&#xff0c;注册在上面的服务可以到Eureka上进行服务实例的拉取&#xff0c;主要作用…

用判断对齐大语言模型

1、写作动机&#xff1a; 目前的从反馈中学习方法仅仅使用判断来促使LLMs产生更好的响应&#xff0c;然后将其作为新的示范用于监督训练。这种对判断的间接利用受到无法从错误中学习的限制&#xff0c;这是从反馈中学习的核心精神&#xff0c;并受到LLMs的改进能力的制约。 2…

了解Spring中的依赖注入:@Autowired vs. @Resource

在Spring框架中&#xff0c;依赖注入是一项关键的特性&#xff0c;通过它&#xff0c;我们能够更灵活、更方便地管理和使用各种组件。在依赖注入的实现中&#xff0c;Resource 和 Autowired 是两个常用的注解&#xff0c;它们分别具有不同的特点和用途。在本篇博客中&#xff0…

来自一个系统的自白

天空一声巨响&#xff0c;小炫我闪亮登场&#xff01;初次见面&#xff0c;给大家简单介绍下自己&#xff1a;我是炫我渲染私有云系统&#xff0c;是最新一代的智能渲染集群系统。可以进行私有化部署&#xff0c;在3dsmax、maya等软件中一键完成提交、上传、渲染、下载的任务&a…

ESP32-WIFI(Arduino)

ESP32-WIFI Wi-Fi是一种基于IEEE 802.11标准的无线局域网技术&#xff0c;是Wi-Fi联盟制造商的商标作为产品的品牌认证。它可以让电脑、手机、平板电脑等设备通过无线信号连接到互联网 。 在无线网络中&#xff0c;AP&#xff08;Access Point&#xff09;和 STA&#xff08;St…

八股文 c++ 多态

静态多态 静态多态&#xff08;编译时多态&#xff09;&#xff1a;主要体现在函数重载&#xff08;Overloading&#xff09;和运算符重载上&#xff0c;编译器根据函数签名在编译阶段就能确定调用哪个函数。 动态多态 动态多态&#xff08;运行时多态&#xff09;&#xff…

leetcode 659. 分割数组为连续子序列

题目链接&#xff1a;leetcode 659 1.题目 给你一个按 非递减顺序 排列的整数数组 nums 。 请你判断是否能在将 nums 分割成 一个或多个子序列 的同时满足下述 两个 条件&#xff1a; 每个子序列都是一个 连续递增序列&#xff08;即&#xff0c;每个整数 恰好 比前一个整数…

1881_S32K344开发工具以及MCAL软件安装

全部学习汇总&#xff1a; GreyZhang/g_s32k344: A new MCU learning notes. I would try to use MCAL instead of SDK. (github.com) 编译有专门的编译器安装包&#xff0c;也有IDE的安装形式。这里我选择了IDE&#xff0c;因为我还需要一个开发调试环境。这个IDE可以让我方便…

使用cURL命令在Linux中测试HTTP服务器的性能

cURL是一个强大的命令行工具&#xff0c;用于从或向服务器传输数据。它支持多种协议&#xff0c;包括HTTP、HTTPS、FTP等。在Linux系统中&#xff0c;cURL可以用于测试和评估HTTP服务器的性能。下面是一些使用cURL命令测试HTTP服务器性能的示例和说明。 1. 基本请求 要向指定…

MySQL8下载安装教程

一、MySQL下载 我的版本是8.2.0&#xff0c;当前的最新版本&#xff0c;网址如下&#xff1a;MySQL :: Download MySQL Community Server 点击No thanks&#xff0c;just start my download&#xff0c;就是只是开始下载的意思&#xff0c;点击下载&#xff0c;等待下载完成 二…

ylov8的训练和预测使用(目标检测)

首先要配置文文件 1-配置数据集的yaml文件&#xff1a; 目录在ultralytics/cfg/datasets/下面&#xff1a; 例如我的&#xff1a; (这里面的yaml文件在/ultralytics/cfg/datasets下面有很多&#xff0c;可以找几个参考一下) path: /path/to/eye_datasets # dataset root di…

java基础之Java8新特性-方法引入

目录 1.简介 2.方法引入 方法引入遵循规范 方法引入种类 1.静态方法引入 2.对象方法引入 3.实例方法引入 4.构造函数引入 1.简介 方法引用是 Java 8 中引入的另一个重要特性&#xff0c;它提供了一种简洁的语法来直接引用现有方法或构造函数。方法引用可以看作是 Lambd…

【Python机器学习】决策树集成——梯度提升回归树

理论知识&#xff1a; 梯度提升回归树通过合并多个决策树来构建一个更为强大的模型。虽然名字里有“回归”&#xff0c;但这个模型既能用于回归&#xff0c;也能用于分类。与随机森林方法不同&#xff0c;梯度提升采用连续的方式构造树&#xff0c;每棵树都试图纠正前一…

【Verilog】期末复习——设计11011序列检测器电路

系列文章 数值&#xff08;整数&#xff0c;实数&#xff0c;字符串&#xff09;与数据类型&#xff08;wire、reg、mem、parameter&#xff09; 运算符 数据流建模 行为级建模 结构化建模 组合电路的设计和时序电路的设计 有限状态机的定义和分类 期末复习——数字逻辑电路分…

nginx反向代理websocket 60秒自动断开处理

参考&#xff1a; https://blog.csdn.net/zqh123zqh/article/details/112795608 添加&#xff1a; proxy_read_timeout 600s; 例如&#xff1a; server {listen 80;server_name carrefourzone.senguo.cc;#error_page 502 /static/502.html;location /static/ {root /home/ch…

功能分享【电商API接口】:商品采集正确使用方法!

相信很多做过电商的人&#xff0c;曾经有在淘宝、京东、天猫、拼多多、1688等平台上卖过自己的产品&#xff0c;但是每换一个平台&#xff0c;商品要重新上传&#xff0c;这浪费了很多没有必要的时间。 为此我们开发了商品采集API功能&#xff0c;一键完成上架商品&#xff0c…

2024年江苏省职业院校技能大赛高职学生组软件测试任务四 单元测试题目

2024年江苏省职业院校技能大赛高职学生组软件测试任务四 单元测试 任务要求 题目1&#xff1a;任意输入2个正整数值分别存入x、y中&#xff0c;据此完成下述分析&#xff1a;若x≤0或y≤0&#xff0c;则提示&#xff1a;“输入不符合要求。”&#xff1b;若2值相同&#xff0…

CHS_01.1.5+操作系统引导

CHS_01.1.5操作系统引导 操作系统的引导一个新的磁盘安装操作系统后操作系统引导&#xff08;开机过程&#xff09; 操作系统的引导 我们会学习操作系统的引导 那你可能看见这个词的时候会觉得莫名其妙不明 绝地 什么是操作系统的引导呢 简单来说就是当你在开机的时候 如何让…