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

二叉树的非递归遍历|前中后序遍历

二叉树的非递归遍历

文章目录

    • 二叉树的非递归遍历
      • 前序遍历-栈
      • 层序遍历-队列
      • 中序遍历-栈
      • 后序遍历-栈

前序遍历-栈

首先我们应该创建一个Stack 用来存放节点,首先我们想要打印根节点的数据,此时Stack里面的内容为空,所以我们优先将头结点加入Stack。之后我们应该先打印左子树,然后右子树,所以先加入Stack的就是右子树,然后左子树。

public List<Integer> preorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<>();if (root == null) {return res;}Stack<TreeNode> stack = new Stack<>();//1.根节点入栈stack.push(root);//2.栈不为空while (!stack.isEmpty()) {//2.1出栈,需暂时保存出栈元素TreeNode tmp = stack.pop();res.add(tmp.val);//2.2左右子树不为空的情况下,出栈元素的右子树入栈,左子树入栈if (tmp.right != null) {stack.push(tmp.right);}if (tmp.left != null) {stack.push(tmp.left);}}return res;
}

层序遍历-队列

首先我们应该创建一个Queue用来存放节点,首先我们想要打印根节点的数据,此时Queue里面的内容为空,所以我们优先将头结点加入Queue。之后我们应该先打印左子树,然后右子树,所以先加入Queue的就是左子树,然后右子树。

public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> res = new ArrayList<>();if (root == null) {return res;}Queue<TreeNode> queue = new LinkedList<>();//1.根节点入队列queue.offer(root);//2.队列不为空while (!queue.isEmpty()) {//2.1获取当前队列的元素List<Integer> level = new ArrayList<>();int size = queue.size();for (int i = 0; i < size; i++) {//2.1.1出队列,需暂时保存出队元素TreeNode tmp = queue.poll();level.add(tmp.val);//2.1.2左右子树不为空的情况下,出队元素的左子树入队,右子树入队if (tmp.left != null) {queue.offer(tmp.left);}if (tmp.right != null) {queue.offer(tmp.right);}}//2.2当前队列元素加入到res中res.add(level);}return res;
}

中序遍历-栈

同理创建一个 Stack。

尽可能的将这个节点的左子树压入 Stack,此时栈顶的元素是最左侧的元素,其目的是找到一个最小单位的子树(也就是最左侧的一个节点),并且在寻找的过程中记录了来源,才能返回上层,同时在返回上层的时候已经处理完毕左子树了。

当处理完最小单位的子树时,返回到上层处理了中间节点。(如果把整个左中右的遍历都理解成子树的话,就是处理完 左子树->中间(就是一个节点)->右子树)

如果有右节点,其也要进行中序遍历。

public List<Integer> inorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<>();if (root == null) {return res;}Stack<TreeNode> stack = new Stack<>();TreeNode cur = root;while (true) {//1.cur从根节点出发,一直向左保存左子树,直到cur=nullwhile (cur != null) {stack.push(cur);cur = cur.left;}//2.若栈为空,退出循环if (stack.isEmpty()) {break;}//3.出栈TreeNode tmp = stack.pop();res.add(tmp.val);//4.cur指向出栈元素的右子树,//若为空则继续出栈,若不为空再继续向左保存子树cur = tmp.right;}return res;
}

后序遍历-栈

同理创建一个 Stack。

尽可能的将这个节点的左子树压入 Stack,此时栈顶的元素是最左侧的元素

该元素无右子树,或者右子树已经访问过,则可以处理该元素,并用prev记录当前已处理的元素

否则访问右子树,进行后序遍历

    public List<Integer> postorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<>();if (root == null) {return res;}Stack<TreeNode> stack = new Stack<>();TreeNode cur = root;TreeNode prev = null;while (true) {//1.cur从根节点出发一直向左保存左子树,直到cur=nullwhile (cur != null) {stack.push(cur);cur = cur.left;}//2.若栈为空,退出循环if (stack.isEmpty()) {break;}//3.得到栈顶元素,先不访问(满足条件才可以访问)TreeNode tmp = stack.peek();//4.若栈顶元素无右子树或者右子树已被访问,则可以访问//若prev==tmp.right,则tmp一定是其右子树的根节点。因为此时右子树已访问完毕if (tmp.right == null || tmp.right == prev) {stack.pop();res.add(tmp.val);prev = tmp;} else { //5.cur指向栈顶元素的右子树cur = tmp.right;}}return res;}

相关文章:

二叉树的非递归遍历|前中后序遍历

二叉树的非递归遍历 文章目录 二叉树的非递归遍历前序遍历-栈层序遍历-队列中序遍历-栈后序遍历-栈 前序遍历-栈 首先我们应该创建一个Stack 用来存放节点&#xff0c;首先我们想要打印根节点的数据&#xff0c;此时Stack里面的内容为空&#xff0c;所以我们优先将头结点加入S…...

开源minio-AWS-S3存储的部署及go操作详细

介绍 MinIO是一个开源的分布式对象存储服务&#xff0c;它允许用户在私有云或公有云环境中构建自己的对象存储基础设施。MinIO旨在提供高性能、高可用性的对象存储&#xff0c;并且与Amazon S3兼容&#xff0c;这意味着可以使用S3客户端工具和库直接与MinIO交互&#xff0c;而…...

【Web2D/3D】Canvas(第三篇)

1. 前言 <canvas>是HTML5新增元素&#xff0c;它是一个画板&#xff0c;开发人员基于它的2D上下文或webgl上下文&#xff0c;使用JS脚本绘制简单的动画、可交互画面&#xff0c;甚至进行视频渲染。 本篇介绍基于canvas的2D上下文绘制2D画面的一些方法和属性。 2. canvas…...

紫光展锐T820与飞桨完成I级兼容性测试 助推端侧AI融合创新

近日&#xff0c;紫光展锐高性能5G SoC T820与百度飞桨完成I级兼容性测试&#xff08;基于Paddle Lite工具&#xff09;。测试结果显示&#xff0c;双方兼容性表现良好&#xff0c;整体运行稳定。这是紫光展锐加入百度“硬件生态共创计划”后的阶段性成果。 本次I级兼容性测试完…...

3DV 2024 Oral | SlimmeRF:可动态压缩辐射场,实现模型大小和建模精度的灵活权衡

目前大多数NeRF模型要么通过使用大型模型来实现高精度&#xff0c;要么通过牺牲精度来节省内存资源。这使得任何单一模型的适用范围受到局限&#xff0c;因为高精度模型可能无法适应低内存设备&#xff0c;而内存高效模型可能无法满足高质量要求。为此&#xff0c;本文研究者提…...

【unity学习笔记】4.场景切换

创建空物体→创建脚本挂载在空物体上→打开脚本 1.创建所需要的场景 assets中点击创建场景 2.文件→生成设置 3.将需要的场景拖入 4.场景跳转 创建空对象&#xff0c;将脚本放在空对象上。 注意两个类&#xff1a;场景类、场景管理类 void Start(){//场景跳转SceneManager.Lo…...

LeetCode75| 滑动窗口

目录 643 子数组最大平均数 | 1456 定长子串中元音的最大数目 1004 最大连续1的个数 ||| 1493 删掉一个元素以后全为1的最长子数组 643 子数组最大平均数 | class Solution { public:double findMaxAverage(vector<int>& nums, int k) {double sum 0;double re…...

gulimall-002 分布式基础概念

1、微服务概念 微服务是一种非常流行的架构风格。 拒绝大型单体应用&#xff0c;基于业务边界进行服务微化拆分&#xff0c;各个服务独立部署运行。 每个服务运行在自己的单个进程使用轻量级机制通信可以使用不同的编程语言编写以及不同的数据存储技术 2、集群&分布式&…...

K8s之声明式APIs

大家好&#xff0c;我是升仔 引言 Kubernetes&#xff08;K8s&#xff09;是一个开源的容器编排系统&#xff0c;用于自动化部署、扩展和管理容器化应用。在K8s中&#xff0c;声明式APIs&#xff08;Application Programming Interfaces&#xff09;是一种核心概念&#xff0…...

Hive执行计划

Hive提供了explain命令来展示一个查询的执行计划&#xff0c;这个执行计划对于我们了解底层原理&#xff0c;Hive 调优&#xff0c;排查数据倾斜等很有帮助。 使用语法如下&#xff1a; explain query;在 hive cli 中输入以下命令(hive 2.3.7)&#xff1a; explain select s…...

Leetcode—62.不同路径【中等】

2023每日刷题&#xff08;七十二&#xff09; Leetcode—62.不同路径 超时dfs代码 class Solution { public:int uniquePaths(int m, int n) {int starti 1, startj 1;int ans 0;function<void(int, int)> dfs [&](int i, int j) {if(i m && j n) {a…...

【汇编笔记】初识汇编-内存读写

汇编语言的由来&#xff1a; CPU是计算机的核心&#xff0c;由于计算机只认识二进制&#xff0c;所以CPU执行的指令是二进制。 我们要想让CPU工作&#xff0c;就得给他提供它认识的指令&#xff0c;这一系列的指令的集合&#xff0c;称之为指令集。 指令集&#xff1a; 不同的体…...

Shell脚本通过渗透测试检测服务器安全!

以下是一个简单的 Shell 脚本通过渗透测试来发现服务器漏洞的例子&#xff1a; #!/bin/bash # 设置变量 server_url"http://example.com" server_port"80" script_path"/path/to/script.脚本" # 创建并打开 Web 服务器 web_server$(curl -s $se…...

数据结构--查找

目录 1. 查找的基本概念 2. 线性表的查找 3. 树表的查找 3.1 二叉排序树 3.1.1 定义: 3.1.2 存储结构&#xff1a; 3.1.3 二叉排序树的查找 3.1.4 二叉排序树的插入 3.1.5 二叉排序树删除 3.2 平衡二叉树&#xff08;AVL 3.2.1 为什么要有平衡二叉树 3.2.2 定义 3.3 B-树 3.3.1…...

IntelliJ IDEA Apache Dubbo,IDEA 官方插件正式发布!

作者&#xff1a;刘军 最受欢迎的 Java 集成开发环境 IntelliJ IDEA 与开源微服务框架 Apache Dubbo 社区强强合作&#xff0c;给广大微服务开发者带来了福音。与 IntelliJ IDEA 2023.2 版本一起&#xff0c;Jetbrains 官方发布了一款全新插件 - Apache Dubbo in Spring Frame…...

使用Visual Studio 2022 winform项目打包成安装程序.exe

winform项目打包 1.安装扩展插件 Microsoft Visual Studio Installer Projects 20222.在解决方案上新建一个setup project 项目3.新建成功如下图&#xff0c;之后添加你的winform程序生成之后的debug下的文件4.在Application Folder上点击右键->Add->项目输出->主输出…...

报错-idea pom.xml 有一条灰色横线

1. 背景 打开 idea 更新代码&#xff0c;发现有个 module 的 pom.xml 有一条灰色横线&#xff0c;导致这个 module 没有加载成功。 2. 原因 1&#xff09; 可能本地 Remove 了这个 module 2&#xff09;本地删除了这个 module &#xff0c;又从远端拉取了回来 3&#xff09…...

openmediavault(OMV) (19)云相册(3)mt-photos

简介 MT Photos是一款为Nas用户量身打造的照片管理系统。通过AI技术,自动将您的照片整理、分类,包括但不限于时间、地点、人物、照片类型。可以在任何支持Docker的系统中运行它。详情可查看mtmt.tech官网,mt-photos是付费订阅使用的,也可以一次性付费永久使用,具体使用mt…...

基于openGauss5.0.0全密态数据库等值查询小案例

基于openGauss5.0.0全密态数据库等值查询小案例 一、全密态数据库简介二、环境说明三、测试步骤四、使用约束 一、全密态数据库简介 价值体现&#xff1a; 密态数据库意在解决数据全生命周期的隐私保护问题&#xff0c;使得系统无论在何种业务场景和环境下&#xff0c;数据在传…...

Oracle中varchar2和nvarchar2的区别

Oracle中的varchar2和nvarchar2都是可变长度的字符数据类型&#xff0c;这意味着它们能够根据实际存储的数据长度来动态调整占用的空间。但它们之间有以下主要区别&#xff1a; 1. 字符编码和存储&#xff1a; - VARCHAR2&#xff1a;存储的是字节字符串&#xff0c;对字符…...

5步精通MQTT性能测试:从插件部署到高并发压测实践指南

5步精通MQTT性能测试&#xff1a;从插件部署到高并发压测实践指南 【免费下载链接】mqtt-jmeter MQTT JMeter Plugin 项目地址: https://gitcode.com/gh_mirrors/mq/mqtt-jmeter 在物联网应用架构中&#xff0c;MQTT协议以其轻量级特性成为设备通信的首选方案。随着设备…...

OpenInTerminal:重塑macOS开发工作流的效率革命工具

OpenInTerminal&#xff1a;重塑macOS开发工作流的效率革命工具 【免费下载链接】OpenInTerminal ✨ Finder Toolbar app for macOS to open the current directory in Terminal, iTerm, Hyper or Alacritty. 项目地址: https://gitcode.com/gh_mirrors/op/OpenInTerminal …...

Qwen3-0.6B-FP8多场景落地:建筑图纸问答+规范条文即时检索系统

Qwen3-0.6B-FP8多场景落地&#xff1a;建筑图纸问答规范条文即时检索系统 1. 引言&#xff1a;当轻量化大模型遇上专业领域 想象一下&#xff0c;你是一位建筑设计师&#xff0c;正在电脑前审阅一份复杂的CAD图纸。你需要快速理解某个构件的尺寸&#xff0c;或者确认某个设计…...

FUTURE POLICE赋能在线教育:AI助教自动批改口语作业

FUTURE POLICE赋能在线教育&#xff1a;AI助教自动批改口语作业 每次上完英语口语课&#xff0c;最头疼的是什么&#xff1f;对很多学生来说&#xff0c;是等待老师批改作业的漫长过程&#xff0c;还有那千篇一律的“发音不错&#xff0c;继续努力”的反馈。对老师而言&#x…...

Llama-3.2V-11B-cot视觉推理实战教程:双卡4090一键部署保姆级指南

Llama-3.2V-11B-cot视觉推理实战教程&#xff1a;双卡4090一键部署保姆级指南 1. 项目概述 Llama-3.2V-11B-cot是基于Meta最新多模态大模型开发的视觉推理工具&#xff0c;专为双卡4090环境优化设计。这个工具让普通用户也能轻松体验11B级大模型的强大视觉推理能力&#xff0…...

Python实战:从零掌握标准正态分布及其可视化

1. 什么是标准正态分布&#xff1f; 我第一次接触标准正态分布是在大学统计课上&#xff0c;当时教授画了一个完美的钟形曲线&#xff0c;说这是自然界最常见的分布。后来做数据分析才发现&#xff0c;这个看似简单的曲线真的无处不在——从人的身高体重到考试分数&#xff0c;…...

C++的std--ranges中的检测引用悬垂

C的std::ranges中的检测引用悬垂&#xff1a;安全迭代的守护者 在现代C编程中&#xff0c;std::ranges库为序列操作提供了更简洁、更安全的抽象。迭代器与范围的使用常伴随一个隐蔽风险&#xff1a;引用悬垂&#xff08;Dangling References&#xff09;。当迭代器指向的底层数…...

YOLO12新手入门:40MB轻量模型,低配置也能流畅运行

YOLO12新手入门&#xff1a;40MB轻量模型&#xff0c;低配置也能流畅运行 1. YOLO12简介与核心优势 1.1 什么是YOLO12 YOLO12是2025年最新发布的目标检测模型&#xff0c;由美国纽约州立大学布法罗分校和中国科学院大学联合研发。这个模型最大的特点是引入了革命性的注意力为…...

Windows LTSC应用商店增强工具:从功能缺失到体验升级的完整方案

Windows LTSC应用商店增强工具&#xff1a;从功能缺失到体验升级的完整方案 【免费下载链接】LTSC-Add-MicrosoftStore Add Windows Store to Windows 11 24H2 LTSC 项目地址: https://gitcode.com/gh_mirrors/ltscad/LTSC-Add-MicrosoftStore 你是否遇到过这样的困境&a…...

Ubuntu系统下识别错误文件格式的解决方案:从JPEG报错到实际文件类型检测

1. 当Ubuntu告诉你"这不是JPEG文件"时发生了什么 那天我正在处理用户上传的图片&#xff0c;突然发现一个诡异现象&#xff1a;同一张"111.jpg"在Windows系统显示正常&#xff0c;但在Ubuntu服务器上却报错"Error interpreting JPEG image file (Not …...