二叉树的递归和非递归方式实现的前中后序遍历(Java版本个人笔记)

算法:二叉树的先序遍历、中序遍历、后序遍历(递归及非递归方式)的java代码实现 首先来看一棵二叉树: 1、前序遍历: 前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树。 若二叉树为空则结束返回,否则: (1)访问根结点; (2)前序遍历左子树; (3)前序遍历右子树 ; 需要注意的是:遍历左右子树时仍然采用前序遍历方法。可以看出前序遍 阅读详情

背景知识:
二叉树(binary tree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树
eg:
在这里插入图片描述
本文主要介绍非递归方式
二叉树节点的定义:

class Node {
    private int val;
    private Node left;//左子树
    private Node right;//右子树

    public Node(int val) {
        this.val = val;
    }

    public int getVal() {
        return val;
    }

    public Node getLeft() {
        return left;
    }

    public Node getRight() {
        return right;
    }

    public void setLeft(Node left) {
        this.left = left;
    }

    public void setRight(Node right) {
        this.right = right;
    }
}

递归方式实现的前中后序遍历

  1. 先序遍历
 public static void preOrder(Node head) {
        if(head == null) return;

        System.out.print(head.getVal()+"-");
        preOrder(head.getLeft());
        preOrder(head.getRight());
    }
  1. 中序遍历
public static void midOrder(Node head) {
        if(head == null) return;

        midOrder(head.getLeft());
        System.out.print(head.getVal()+"-");
        midOrder(head.getRight());
    }
  1. 后序遍历
public static void lastOrder(Node head) {
        if(head == null) return;

        lastOrder(head.getLeft());
        lastOrder(head.getRight());
        System.out.print(head.getVal()+"-");
    }

非递归方式实现前中后序遍历
先序遍历
思路:因为先序遍历的顺序是:头左右,利用一个栈,先将头节点入栈,然后栈不为空时就弹出(pop)节点,弹出就打印,然后先将右孩子节点入栈,再讲左孩子入栈(这样出站的顺序就是先左孩子再右孩子)

public static void preOrderNo(Node rootNode) {
        if(rootNode == null) return;

        Stack<Node> stack = new Stack<>();
        stack.push(rootNode);
        while(!stack.empty()) {
            Node node = stack.pop();
            System.out.print(node.getVal()+"-");
            if(node.getRight() != null) {
                stack.push(node.getRight());
            }

            if(node.getLeft() != null) {
                stack.push(node.getLeft());
            }
        }
    }

中序遍历
思路:从根结点开始依次将其左孩子入栈,直到左孩子为空,为空时就从栈中弹出(pop()方法)节点,弹出就打印,然后拿到弹出节点的右孩子(如果存在),将该右孩子右继续重复上一过程(判断左孩子是否存在,存在就入栈)

    public static void midOrderNo(Node head) {
        if(head == null) return;
        Stack<Node> stack = new Stack<>();

        while(!stack.isEmpty() || head != null) {
            if(head != null) {
                stack.push(head);
                head = head.getLeft();
            } else {
                head = stack.pop();
                System.out.print(head.getVal()+"-");
                head = head.getRight();
            }
        }
    }

后序遍历
思路:定义两个栈,先将头节点入栈,然后栈不为空时开始出栈,弹出一个节点就将该节点放入到另外一个栈中,然后将该节点的左右孩子入栈,入栈顺序按照:先左孩子(如果存在)入栈,再右孩子(如果存在)入栈,然后一直重复以上过程,知道栈为空,然后将另外一个栈依次出栈打印节点,就得到后序遍历

 public static void lastOrderNo(Node head) {
        if(head == null) return ;
        Stack<Node> stack = new Stack<>();
        Stack<Node> stack2 = new Stack<>();
        stack.push(head);

        while(!stack.empty()) {
            Node cur = stack.pop();
            stack2.push(cur);

            if(cur.getLeft() != null) {
                stack.push(cur.getLeft());
            }

            if(cur.getRight() != null) {
                stack.push(cur.getRight());
            }
        }
        while(!stack2.empty()) {
            System.out.print(stack2.pop().getVal()+"-");
        }
    }

测试代码:
树结构:
在这里插入图片描述

public class MyTree {
    public static void main(String[] args) {
        Node node1 = new Node(1);
        Node node2 = new Node(2);
        node1.setLeft(node2);
        Node node3 = new Node(3);
        node1.setRight(node3);
        Node node4 = new Node(4);
        node2.setLeft(node4);
        Node node5 = new Node(5);
        node2.setRight(node5);
        Node node6 = new Node(6);
        node3.setLeft(node6);
        Node node7 = new Node(7);
        node6.setLeft(node7);
        /*       1
            2         3
         4     5     6
                    7
         */
        //先序遍历 头左右  预期:1 2 4 5 3 6 7
        System.out.println("递归遍历的三种方式:");
        System.out.println("先序遍历");
        preOrder(node1);
        System.out.println('\n'+"========================");
        //中序遍历 左头右  预期:4 2 5 1 7 6 3
        System.out.println("中序遍历");
        midOrder(node1);
        System.out.println('\n'+"========================");
        //后序遍历 左右头 预期: 4 5 2 7 6 3 1
        System.out.println("后序遍历");
        lastOrder(node1);
        System.out.println();
        System.out.println("非递归遍历的三种方式:");

        System.out.println("非递归先序遍历");
        preOrderNo(node1);
        System.out.println('\n'+"========================");

        System.out.println("非递归中序遍历");
        midOrderNo(node1);
        System.out.println('\n'+"========================");

        System.out.println("非递归后序遍历");
        lastOrderNo(node1);
    	}
    }

运行结果:
在这里插入图片描述

用递归和非递归方式实现二叉树先序、中序和后序遍历 import java.util.Stack; //分别用递归和非递归方式实现二叉树先序、中序和后序遍历 public class TreeTravel{ //二叉树节点的定义 public static class Node{ public int value; public Node left; public Node right; 阅读详情

相关推荐

薛定谔 | 先导化合物优化与相互作用可视化

当获得针对某个靶点的先导分子后,想要在此基础上进行化学结构修饰。为了提升化学改造的成功率可以采用本教程方法进行结构虚拟改造/优化。每用薛定谔处理一个新任务,第一步必须创建新的project以方便日后管理。选项卡中修改工作路径(可以方便地找到输出文件)

药研猿的博客 2143

二叉树非递归遍历实现(Java)

二叉树非递归遍历

weixin_50813307的博客 1639

Linux环境下OpenSSH升级到 OpenSSH_9.8p1(内置保姆级教程并包含openssl升级过程)

2024年7月1日接到安全部门同事邮件通知,目前生产环境及测试环境服务器Openssh存在远程代码执行漏洞(CVE-2024-6387),漏洞等级高,且攻击者可以成功利用该漏洞获得远程root shell最高权限从而执行任意代码及命令,主要受影响版本为8.5p1

菜鸟运维升级之路 2万+

【二叉树Java】二叉树遍历前序中序后序遍历的非递归写法

二叉树遍历的非递归写法

liuwanqing233333的博客 3133

2024高校网络安全管理运维赛题目--复现+题目+wp

官方writeup集思广益比较好的备份。

书山有路勤为径,学海无涯苦作舟 1319

零代码搭建专业知识库:Wiki.js+cpolar让团队协作像写笔记一样简单

"项目文档又找不到了!“团队负责人小张第N次在群里看到这样的抱怨——技术文档分散在邮件、网盘和个人电脑里,新人入职要花一周熟悉文档位置,远程协作时版本混乱更是家常便饭。Wiki.js与cpolar内网穿透服务的出现,就像给团队协作装上了"中央大脑”,用写Markdown笔记的简单方式,搭建一个专业的知识库系统。普通人对知识管理的需求其实很简单:方便记录、容易查找、大家能用。但传统方案把这个过程搞得异常复杂:建服务器、配环境、学语法、搞权限……大部分团队还没开始就放弃了。

Yawesh的博客 2036

Java二叉树前序遍历:递归+非递归实现,非递归详解

二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树。 如下便是一棵二叉树: 二叉树的前序遍历: 1. 遍历根节点 2. 如果存在左子树,先序遍历左子树 3. 如果存在右子树,先序遍历右子树 二叉树结构定义: class TreeNode { int val; TreeNode left; TreeNode right; TreeNode() {} TreeNode(int val) { this.va

进击的Coder*的博客 2076

别再问“这游戏啥引擎做的”了,手把手教你用SteamDB一键查询(附实战案例)

本文详细介绍了如何使用SteamDB一键查询游戏引擎信息,包括Unity 3D、Unreal Engine等热门引擎的识别方法。通过实战案例和高级查询技巧,帮助玩家快速获取游戏技术底细,优化游戏体验和兼容性分析。

weixin_31412781的博客 815

二叉树的前中后序遍历的非递归形式【Java】

递归形式的遍历都会有一个递归栈,因此对于非递归形式也可以使用一个栈来模拟递归栈来保存过程中的变量

weixin_67623483的博客 739

标签传播算法LPA:半监督学习解决标注数据不足的完整实战指南

在机器学习实际工程中,标注数据稀缺往往是制约模型性能的核心瓶颈。半监督学习提供了一条利用海量未标注数据来增强模型泛化能力的有效路径,其中标签传播算法(Label Propagation Algorithm, LPA)因其直观的图结构和优雅的数学原理而备受关注。LPA通过将样本映射为图中的节点,以相似度作为边权重,让已知标签沿着图结构不断扩散,从而实现对未知样本的预测。其背后基于聚类假设与流形假设,能在低标注率场景下显著缓解过拟合问题,提升分类准确率。该技术在文本分类、金融风控、图像识别等存在大量无标注数据的

weixin_29056781的博客 239

基于STC8A8K64S4A12的掉电唤醒定时器应用,极大降低产品功耗

通过合理的配置和编程,我们可以充分发挥单片机的功能,实现能效优化和电池寿命延长的目标。其中,掉电唤醒定时器是其一项重要功能,可以在系统处于睡眠状态时通过定时器的计时功能进行唤醒,从而实现对系统功耗的有效控制。使用STC8A8K64S4A12的掉电唤醒定时器功能,我们可以在不影响系统正常工作的情况下,大大降低产品的功耗。通过以上的代码,我们实现了一个简单的掉电唤醒定时器功能。当系统进入睡眠模式后,定时器开始计时,到达预设的唤醒时间后,定时器中断被触发,系统从睡眠模式唤醒,执行相应的操作。

CodeSageX的博客 1090

二叉树前序遍历的 Java 实现,包括递归和非递归两种方式

前序遍历的时间复杂度为 O(n),其中 n 是树中节点的总数,因为每个节点都要被访问一次。适用场景:在某些场景下,例如复制树或者进行某些类型的树形操作,前序遍历是非常有效的。树的结构:前序遍历能够保存树的结构。非递归实现的空间复杂度也是 O(h),因为栈中存储的节点数不超过树的高度。递归实现的空间复杂度为 O(h),h 是树的高度,主要由递归调用栈占用。递归与非递归:前序遍历可以通过递归和非递归(使用栈)两种方式实现。下面是二叉树前序遍历的 Java 实现,包括递归和非递归两种方式。

qq_46091953的博客 663

爬虫瑞数5.5案例:欧冶钢材交易官网,带后缀K5nOZLud(面向对象补环境)

瑞数动态安全 Botgate(机器人防火墙)以“动态安全”技术为核心,通过动态封装、动态验证、动态混淆、动态令牌等技术对服务器网页底层代码持续动态变换,增加服务器行为的“不可预测性”,实现了从用户端到服务器端的全方位“主动防护”,为各类 Web、HTML5 提供强大的安全保护。由于之前某通信的瑞数已经调整,这里再出一篇文章,瑞数特点以及请求执行的流程已在之前的文章中分析过,这里不再特别讲解;

老衲爱洗头的博客 3042

二叉树的后序遍历非递归算法

1. 对于树的遍历我们最常用的三种遍历方法分别是前序遍历、中序遍历和后序遍历,使用的方法是深度优先遍历树的每一个节点,这些遍历方法都是使用递归函数来进行实现的,在数据量大的情况下是比较低效的,原因在于系统帮助我们调用了一个栈并且做了诸如保护现场和恢复现场等复杂的操作,才使得遍历可以使用非常简单的代码来实现,所以我们可以模仿系统中调用的栈自己可以来写一下栈,模仿其中的过程就可以完成对于三种遍历算法的...

二哈 4万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

java实现二叉树的遍历(递归和非递归)

现有一颗如下图所示的二叉树: 其遍历的各种方式如下: 构造一颗如下图所示的二叉树,用java实现其前序,中序,后序遍历 注意二叉树节点的定义如下: public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val =...

FREEMAN 4万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

树、二叉树的前中后层序遍历(递归、非递归Java实现)

文章目录1. 二叉树的前中后序遍历(递归,非递归)以及层序遍历1.1 二叉树前中后遍历的递归解法1.2 二叉树前中后遍历的非递归解法1.2.1 非递归的前序遍历:(LeetCode 144)1.2.2 非递归的中序遍历:(LeetCode 94)1.2.3 非递归的后序遍历:(LeetCode 145)1.3 层序遍历:(LeetCode 102、103、107)2 树的前中后层序遍历2.1 前序...

卤小蛋学编程 5077

二叉树后序遍历(递归+非递归)Java

目录一、结构二、遍历二叉树1.后序遍历(递归)代码图解功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 一、结构 ...

dabusiGin的博客 6340

Java二叉树三序遍历的非递归实现

Java二叉树三序遍历的非递归实现

2301_79698279的博客 2104

二叉树遍历方法——前、中、后序遍历(java)

前序遍历是一种访问二叉树的每一个结点的方法,它的遍历顺序是根节点,左子树,右子树。

loss_rose777的博客 5万+

先中后序遍历二叉树(递归、非递归)(Java)

思路: 递归、非递归两种方式,递归、非递归遍历二叉树 代码: package com.my.test.datastructure.tree; import java.util.Stack; /** * 先中后序遍历二叉树(递归、非递归) */ public class BinaryTreeVisit { static class Node { int...

聚沙成塔 4944

左神算法:分别用递归和非递归方式实现二叉树先序、中序和后序遍历(Java版)

本题来自左神《程序员代码面试指南》“分别用递归和非递归方式实现二叉树先序、中序和后序遍历”题目。 题目 用递归和非递归方式,分别按照二叉树先序、中序和后序打印所有的节点。 我们约定: 先序遍历顺序为根、左、右; 中序遍历顺序为左、根、右; 后序遍历顺序为左、右、根。 二叉树节点定义如下: public static class Node { public int value; public Node left; public Node right; public Node(int data.

寒泉 6万+

Java二叉树前中后序的非递归实现

此文章主要讲解了二叉树前中后序遍历的面试题讲解,上次为大家带来的是二叉树前中后序遍历的递归实现,今天为大家带来的是二叉树前中后序遍历的非递归实现,习题链接及讲解都在文章中,希望大家能好好学习这一节的知识!

xinhang10的博客 669

递归和非递归方式实现二叉树的先序、中序和后序遍历

二叉树的递归实现和非递归实现、递归序

明朗晨光的专栏 2459

【Java数据结构】二叉树的前中后序遍历(递归和非递归)

*这段代码还有一个问题 我们外层的循环条件是cur!=null 但是我们在cur获取到D的右子节点时 此时cur又为空了 此时循环条件不满足 循环就结束了 但是我们还没有遍历完这棵二叉树 我们还有什么依据来继续循环呢?我们不采用递归的方式 但是要模拟递归的思路。**递归实现的代码都十分相似 **例如这颗树 我们用它举例。前序遍历的遍历方式是。

m0_72670269的博客 2037

二叉树1:实现二叉树的先序、中序、后序遍历,包括递归方式和非递归方式

二叉树的先序遍历:3种遍历理解

qq_43091156的博客 4060

【强基计划】LeetCode—二叉树的前、中、后序的非递归实现

【强基计划】LeetCode—二叉树的前序、中序、后序的非递归实现!

冲击大厂之路!!! 737
上一篇: 一行代码解决JavaWeb中sevlet使用PrintWriter流向网页输出中文产生乱码
下一篇: 解决shiro重定向URL中出现sessionID的情况localhost:8080/toLogin;jsessionid=D5C1EE61B97EE2D7098F58A837B82BD4
JavaWizard-M
博客等级 码龄6年 3159粉丝 148原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值