二叉树的非递归遍历

article/2025/9/22 17:17:21

目录

一.前序遍历(根左右)

1.思路图解

2.代码

二.中序遍历(左根右)

1.思路图解

2.代码

三.后序遍历(左右根) 

1.思路图解

2.代码

四.层序遍历

1.思路图解

2.代码


一.前序遍历(根左右)

1.思路图解

循环处理条件为栈是否为空或当前结点是否为空

第一次 遍历根结点1且根结点入栈,然后循环处理当前根结点的左子树,当根结点及根的左子树处理完后,开始处理以栈中结点的右子树为根结点重复上述步骤,最终处理完成后后,list中的元素结果就是前序遍历的结果

2.代码

 public List<Integer> preorderTraversal(TreeNode root) {Stack<TreeNode> stack = new Stack<>();List<Integer> list = new ArrayList<>();TreeNode node = root;while(!stack.empty() || node!=null) {//一直处理当前结点的左子树,左孩子处理完后入栈while(node!=null) {list.add(node.val);stack.push(node);node = node.left;}//左子树处理完,处理栈顶元素的右子树(根节点和左子树已经处理完)node = stack.pop().right;}return list;}

二.中序遍历(左根右)

1.思路图解

先处理以当前结点为根的所有左孩子(入栈),当所有的左孩子处理完成后,这时候栈顶元素就是最左边的孩子,然后处理该元素(放到集合中),接着以该元素为根节点再重复上面的步骤,最终集合结果就是中序遍历.

2.代码

public int[] inorderTraversal (TreeNode root) {// write code hereList<Integer> list = new ArrayList<>();Stack<TreeNode> stack = new Stack<>();TreeNode cur = root;while(!stack.isEmpty() || cur!=null) {//先处理所有的左子树中的节点while(cur!=null) {stack.push(cur);cur = cur.left;}//处理栈中的根结点,然后再重复上面步骤处理以当前结点为根节点的子树TreeNode tmp = stack.pop();list.add(tmp.val);cur = tmp.right;}int[] res = new int[list.size()];for(int i=0; i<list.size(); i++) {res[i] = list.get(i);}return res;}

三.后序遍历(左右根) 

1.思路图解

先处理根的左右子树,由于在处理到右子树的时候,会回溯到父节点,所以需要借助一个前驱结点来记录当前结点的右子树是否已经遍历过了,如果当前结点的右子树已经遍历过,或者当前结点的右子树为空(这两种结果都说明以当前结点为根节点的左右子树都已经处理完了),这时候就需要处理当前结点,处理完当前结点后,记录前驱结点为当前结点,然后将当前结点置为空(置空说明当前结点的左右子树都已经处理完成了)

2.代码

    public int[] postorderTraversal (TreeNode root) {// write code hereTreeNode pre = null;//标记右子树是否访问过TreeNode cur = root;Stack<TreeNode> stack = new Stack<>();ArrayList<Integer> list = new ArrayList<>();while(cur!=null || !stack.empty()) {//将左子树的所有节点放到栈中while(cur != null) {stack.push(cur);cur = cur.left;}//查看栈顶元素的是否存在右子树,如果存在,是否已经访问过cur = stack.peek();if(cur.right == null || pre==cur.right) {//说明当前结点没有右子树或者右子树已经处理了//这时候就可以处理当前根结点了stack.pop();list.add(cur.val);pre = cur;cur = null;}else {//说明当前节点的右子树没有处理,继续处理cur = cur.right;}}int[] res = new int[list.size()];for(int i=0; i<list.size(); i++) {res[i] = list.get(i);}return res;}

四.层序遍历

1.思路图解

借助队列先进先出的原理,实现每一层元素的遍历,在遍历当前层元素的时候,首先需要获取队列当前的大小,因为初始时队列中元素是只有一层元素,在出队列的时候之后可能会有元素入队列,在处理当前层元素的时候,需要判断当前元素的左右孩子是否存在,如果存在,就入队列,因为队列需要保存下一层元素;之后集合中的结果就为层序遍历的结果。

 

 

2.代码

 public ArrayList<ArrayList<Integer>> levelOrder (TreeNode root) {ArrayList<ArrayList<Integer>> res = new ArrayList<>();//空树,直接返回if(root == null) {return res;}//借助队列实现层序遍历Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);while(!queue.isEmpty()) {//计算当前一层元素的个数,之后根据该大小出队列int size = queue.size();//使用list保存当前层的元素个数ArrayList<Integer> list = new ArrayList<>();for(int i=0; i<size; i++) {TreeNode tmp = queue.poll();list.add(tmp.val);//处理当前结点的左右子树if(tmp.left != null) {queue.offer(tmp.left);}if(tmp.right != null) {queue.offer(tmp.right);}}//将当前层元素添加到结果集中res.add(list);}return res;}


http://chatgpt.dhexx.cn/article/LGGCiAET.shtml

相关文章

smile——Java机器学习引擎

介绍 Smile&#xff08;统计机器智能和学习引擎&#xff09;是一个基于Java和Scala的快速、全面的机器学习、NLP、线性代数、图形、插值和可视化系统。 凭借先进的数据结构和算法&#xff0c;Smile提供了最先进的性能。Smile有很好的文档记录&#xff0c;请查看项目网站以获取…

Java机器学习库(Java ML)(一、分类)

本文章翻译至Java ML技术文档classification.pdf&#xff0c;代码部分是参考该文档使用IDEA编写&#xff0c;同时加入了运行结果。 分类 本文介绍与分类相关的功能。 该文章假设您已熟悉Java ML的基础知识&#xff0c;如入门教程中所述&#xff08;http://java-ml.sourcefor…

目前流行的、强大的基于Java的机器学习开发库精选

图片来源: Mindfire Solutions 现如今&#xff0c;拥有深度学习和机器学习领域的技术是科技界的趋势之一&#xff0c;并且企业则希望雇佣一些拥有良好的机器学习知识背景的程序开发工程师。本文将介绍一些目前流行的、强大的基于Java的机器学习库&#xff0c;希望给大家带来帮助…

JAVA 人工神经网络实现,机器学习,人工智能

人工智能&#xff08;AI&#xff09; 、机器学习&#xff08;ML&#xff09;、深度学习&#xff08;DL&#xff09;、神经网络&#xff08;CNN&#xff09; IT技术圈的人怼这些词汇大家都一定耳熟能详了&#xff0c;可能圈外的也不陌生&#xff0c;但是作为一个作为一个“攻城…

机器学习java_如何开始使用Java机器学习

机器学习java 什么是开始使用Java机器学习的最佳工具&#xff1f; 他们已经存在了一段时间&#xff0c;但如今看来&#xff0c;每个人都在谈论人工智能和机器学习。 对于科学家和研究人员而言&#xff0c;它已经不再是秘密&#xff0c;几乎可以在任何新兴技术中实现。 在下面…

谁说搞Java的不能玩机器学习?

简介 机器学习在全球范围内越来越受欢迎和使用。 它已经彻底改变了某些应用程序的构建方式&#xff0c;并且可能会继续成为我们日常生活中一个巨大的&#xff08;并且正在增加的&#xff09;部分。没有什么包装且机器学习并不简单。 它对许多人来说似乎非常复杂并常常令人生畏…

基于 Java 机器学习自学笔记 (第51-53天:kNN)

注意&#xff1a;本篇为50天后的Java自学笔记扩充&#xff0c;内容不再是基础数据结构内容而是机器学习中的各种经典算法。这部分博客更侧重与笔记以方便自己的理解&#xff0c;自我知识的输出明显减少&#xff0c;若有错误欢迎指正&#xff01; 目录 一、关于数据集及其导入…

基于 Java 机器学习自学笔记 (第66至68天:主动学习之ALEC)

注意&#xff1a;本篇为50天后的Java自学笔记扩充&#xff0c;内容不再是基础数据结构内容而是机器学习中的各种经典算法。这部分博客更侧重于笔记以方便自己的理解&#xff0c;自我知识的输出明显减少&#xff0c;若有错误欢迎指正&#xff01; 目录 前言 一、关于学习的分类…

超全!基于Java的机器学习项目、环境、库...

https://yq.aliyun.com/articles/278837?utm_sourcetuicool&utm_mediumreferral 摘要&#xff1a; 你是一名希望开始或者正在学习机器学习的Java程序员吗&#xff1f; 利用机器学习编写程序是最佳的学习方式。你可以从头开始编写算法&#xff0c;但是利用现有的开源库&am…

结合Java和机器学习技术,如何驾驭大数据提升业务效率和竞争力?

随着大数据的不断增长和发展&#xff0c;越来越多的企业和组织开始关注如何利用大数据来提高业务效率和竞争力。在大数据分析领域&#xff0c;Java和机器学习技术是两个非常重要的方向。本文将介绍这两个技术的基本概念、应用场景和发展趋势&#xff0c;并重点探讨如何结合Java…

25个JAVA 机器学习工具包

本列表总结了25个Java机器学习工具&库&#xff1a; 1. Weka集成了数据挖掘工作的机器学习算法。这些算法可以直接应用于一个数据集上或者你可以自己编写代码来调用。Weka包括一系列的工具&#xff0c;如数据预处理、分类、回归、聚类、关联规则以及可视化。 2.Massive Onli…

7个最好的Java机器学习开发库

IT派 - {技术青年圈} 持续关注互联网、区块链、人工智能领域 摘要&#xff1a; 本文将介绍一些目前流行的、强大的基于Java的机器学习库。 图片来源: Mindfire Solutions 摘要&#xff1a;现如今&#xff0c;拥有深度学习和机器学习领域的技术是科技界的趋势之一&#xff0c;并…

基于 Java 机器学习自学笔记 (第71-73天:BP神经网络)

注意&#xff1a;本篇为50天后的Java自学笔记扩充&#xff0c;内容不再是基础数据结构内容而是机器学习中的各种经典算法。这部分博客更侧重于笔记以方便自己的理解&#xff0c;自我知识的输出明显减少&#xff0c;若有错误欢迎指正&#xff01; 前言 本文是我计划描述BP神经网…

如何开始Java机器学习

什么是开始使用Java机器学习的最佳工具&#xff1f; 他们已经存在了一段时间&#xff0c;但如今看来&#xff0c;每个人都在谈论人工智能和机器学习。 对于科学家和研究人员而言&#xff0c;它已不再是秘密&#xff0c;几乎可以在任何新兴技术中实现。 在下面的文章中&#x…

如何开始使用 Java 机器学习

开始Java机器学习的最好工具是什么&#xff1f; 这个问题已经有一段时间了&#xff0c;但最近这些日子几乎每个人都在谈论人工智能和机器学习。这已经不再是一个保留给科学家和研究者的秘密&#xff0c;而是几乎实现于每一项新兴技术中。 在下面的章节中&#xff0c;我们会做一…

6大最常用的Java机器学习库一览

导读&#xff1a;机器学习是目前盛行于世的技术之一&#xff0c;这几年一时风头无两。虽然在机器学习中&#xff0c;Python是人工智能从业者使用最多的编程语言&#xff0c;但是&#xff0c;Java 在项目开发中仍然发挥着不可替代的作用&#xff0c;而且许多流行的机器学习框架本…

基于 Java 机器学习自学笔记 (第60天:过去十日的总结)

注意&#xff1a;本篇为50天后的Java自学笔记扩充&#xff0c;内容不再是基础数据结构内容而是机器学习中的各种经典算法。这部分博客更侧重于笔记以方便自己的理解&#xff0c;自我知识的输出明显减少&#xff0c;若有错误欢迎指正&#xff01; 目录 1.尝试作为知识的输出者 …

机器学习入门-用Java实现简单感知机

一、通俗理解机器学习 1、机器学习是人工智能的一种&#xff0c;如图所示&#xff0c;它是人工智能的一个子方向。 2、机器学习有点像人类的学习过程。 1. 人类学习通过经验(事件)&#xff0c;归纳出规律。 2. 机器学习通过数据&#xff0c;训练出模型。 3、机器学习不是基于编…

机器学习算法 java_Java开发人员的机器学习,第1部分:机器学习算法

机器学习算法 java 无人驾驶汽车&#xff0c;面部检测软件和语音控制扬声器均基于机器学习技术和框架构建&#xff0c;而这些仅仅是第一波。 在接下来的十年中&#xff0c;新一代产品将改变我们的世界&#xff0c;为软件开发以及我们创建和使用的应用程序和产品启动新的方法。 …

【Java应用】使用Java实现机器学习算法:聚类、分类、预测

一、引言 1、机器学习算法概述 机器学习是一种人工智能技术&#xff0c;旨在通过使用数据和统计分析来让计算机系统自动改进性能。机器学习算法可分为三大类&#xff1a;聚类、分类和预测。聚类算法用于将数据集分成不同的群组&#xff1b;分类算法用于将数据分为不同的类别&…