[算法]二叉树的遍历算法Java实现版本(递归/非递归/先序/中序/后序)

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

直接上代码,一切尽在代码中。本类可以直接使用,可以按照您的用途做简单修改。单元测试部分在main函数。转载请著名出处,谢谢。

 

package com.datastructure.tree;


import java.util.Stack;


/**
 * 二叉树的遍历算法Java实现版本(递归/非递归/先序/中序/后序)
 *
 * Note: 1. 要求JDK5及其以上
 *
 *
 * @author Ciro Deng(ciro.deng@qq.com)
 * @version 1.0
 *
 */
public class TraverseBinTree {


 /**
  * 首先定义树的类型,使用泛型以保证对不同data类型的兼容.
  *
  * @param <T>
  *            不同data类型
  */
 public static class Node<T> {
  Node<T> lchild;
  Node<T> rchild;
  T data;


  public Node(Node<T> lchild, Node<T> rchild, T data) {
   super();
   this.lchild = lchild;
   this.rchild = rchild;
   this.data = data;
  }


  @Override
  public String toString() {
   return data.toString();
  }


 }


 // ===================非递归算法============================//
 /**
  * 二叉树先序非递归遍历算法。
  *
  * @param <T>
  *            不同data类型
  * @param t
  *            二叉树的根节点
  */
 public static <T> void preOrderUnrecur(Node<T> t) {
  if (t == null)
   return;


  Stack<Node<T>> stack = new Stack<Node<T>>();


  stack.push(t);
  while (!stack.isEmpty()) {
   while (stack.peek() != null) {
    System.out.print(stack.peek());
    stack.push(stack.peek().lchild);
   }
   Node<T> p = stack.pop();


   if (!stack.isEmpty()) {
    p = stack.pop();
    stack.push(p.rchild);
   }
  }


 }


 /**
  * 二叉树中序非递归遍历算法。
  *
  * @param <T>
  *            不同data类型
  * @param t
  *            二叉树的根节点
  */
 public static <T> void inOrderUnrecur(Node<T> t) {
  if (t == null)
   return;


  Stack<Node<T>> stack = new Stack<Node<T>>();


  stack.push(t);
  while (!stack.isEmpty()) {
   while (stack.peek() != null) {
    stack.push(stack.peek().lchild);
   }
   Node<T> p = stack.pop();


   if (!stack.isEmpty()) {
    System.out.print(stack.peek());
    p = stack.pop();
    stack.push(p.rchild);
   }
  }


 }


 /**
  * 二叉树后序非递归遍历算法。
  *
  * @param <T>
  *            不同data类型
  * @param t
  *            二叉树的根节点
  */
 public static <T> void postOrderUnrecur(Node<T> t) {
  if (t == null)
   return;
  Stack<Node<T>> stack = new Stack<Node<T>>();
  stack.push(t);
  Node<T> p = null;
  boolean tag = true;
  while (!stack.isEmpty()) {
   t = stack.peek();
   while (t != null && tag) {
    stack.push(t.lchild);
    t = t.lchild;
   }


   if (tag) {
    stack.pop();
   }


   if (!stack.isEmpty()) {


    if (stack.peek().rchild == p) {
     t = stack.pop();
     System.out.print(t);
     p = t;
     tag = false;
    } else {
     stack.push(stack.peek().rchild);
     tag = true;
     p = null;


    }


   }
  }


 }


 /**
  * 二叉树中序非递归遍历算法. 写的冗繁,不建议使用.
  *
  * @param <T>
  *            不同data类型
  * @param t
  *            二叉树的根节点
  * @deprecated
  */
 @SuppressWarnings("unused")
 private static <T> void inOrderUnrecurByCiro(Node<T> t) {
  // 空二叉树,直接返回。
  if (t == null)
   return;


  boolean started = false;
  Stack<Node<T>> stack = new Stack<Node<T>>();


  stack.push(t);
  while (!stack.isEmpty()) {
   t = stack.pop();
   if ((stack.isEmpty() && !started)
     || (!stack.isEmpty() && stack.peek().lchild != t)) {
    stack.push(t);
    while (t.lchild != null) {
     stack.push(t.lchild);
     t = t.lchild;
    }
   } else {
    stack.push(t);
   }
   t = stack.pop();
   System.out.print(t); // 访问节点操作
   started = true;
   if (t.rchild != null) {
    stack.push(t.rchild);
   }
  }
 }


 // ===================递归算法============================//
 /**
  * 二叉树先序递归遍历算法。
  *
  * @param <T>
  *            不同data类型
  * @param t
  *            二叉树的根节点
  */
 public static <T> void preOrderRecur(Node<T> t) {
  if (t != null) {
   System.out.print(t);
   preOrderRecur(t.lchild);
   preOrderRecur(t.rchild);
  }


 }


 /**
  * 二叉树中序递归遍历算法。
  *
  * @param <T>
  *            不同data类型
  * @param t
  *            二叉树的根节点
  */
 public static <T> void inOrderRecur(Node<T> t) {
  if (t != null) {
   inOrderRecur(t.lchild);
   System.out.print(t);
   inOrderRecur(t.rchild);
  }


 }


 /**
  * 二叉树后序递归遍历算法。
  *
  * @param <T>
  *            不同data类型
  * @param t
  *            二叉树的根节点
  */
 public static <T> void postOrderRecur(Node<T> t) {
  if (t != null) {
   postOrderRecur(t.lchild);
   postOrderRecur(t.rchild);
   System.out.print(t);
  }


 }


 // ===================单元测试============================//
 public static void main(String[] args) {
  /*
   * 样本二叉树
   *                        A
   *                        |    
   *                   |---------|
   *                   B         C
   *                   |         |
   *              |---------|     -----|
   *              D         E          F
   *              |
   *               ----|
   *                   G
   */
  Node<String> g = new Node<String>(null, null, "G");
  Node<String> e = new Node<String>(null, null, "E");
  Node<String> f = new Node<String>(null, null, "F");
  Node<String> d = new Node<String>(null, g, "D");
  Node<String> b = new Node<String>(d, e, "B");
  Node<String> c = new Node<String>(null, f, "C");
  Node<String> a = new Node<String>(b, c, "A");


        System.out.println("          ");
        System.out.println("* 样本二叉树");
        System.out.println("*                        A");
        System.out.println("*                        |     ");
        System.out.println("*                   |---------|");
        System.out.println("*                   B         C");
        System.out.println("*                   |         |");
        System.out.println("*              |---------|     -----|");
        System.out.println("*              D         E          F");
        System.out.println("*              |");
        System.out.println("*               ----|");
        System.out.println("*                   G");
       
        System.out.print("非递归先序遍历结果:");
        preOrderUnrecur(a);
        System.out.println();
        System.out.print("递归先序遍历结果:");
        preOrderRecur(a);
        System.out.println();
       
        System.out.print("非递归中序遍历结果:");
        inOrderUnrecur(a);
        System.out.println();
        System.out.print("递归中序遍历结果:");
        inOrderRecur(a);
        System.out.println();
  
        System.out.print("非递归后序遍历结果:");
        postOrderUnrecur(a);
        System.out.println();
        System.out.print("递归后序遍历结果:");
        postOrderRecur(a);
        System.out.println();
       


 }
}

 

 

=============执行结果==============
          
* 样本二叉树
*                        A
*                        |    
*                   |---------|
*                   B         C
*                   |         |
*              |---------|     -----|
*              D         E          F
*              |
*               ----|
*                   G
非递归先序遍历结果:ABDGECF
递归先序遍历结果:ABDGECF
非递归中序遍历结果:DGBEACF
递归中序遍历结果:DGBEACF
非递归后序遍历结果:GDEBFCA
递归后序遍历结果:GDEBFCA

 

二叉树的非递归遍历:Java语言实现 1 前言       上一篇写了《二叉树的递归遍历:Java语言实现》,现在用java实现下二叉树的非递归遍历。2 二叉树的非递归遍历2.1 先序遍历       根据前序遍历访问的顺序,优先访问根结点,然后再分别访问左孩子和右孩子。即对于任一结点,其可看做是根结点,因此可以直接访问。访问完之后,若其左孩子不为空,按相同规则访问它的左子树;当访问其左子树时,再访问它的右子树。因此其处理过程如下:对... 阅读详情

相关推荐

【脚本篇】---spyglass lint脚本

【代码】【脚本篇】---spyglass lint脚本。

冬瓜 6356

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

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

二哈 4万+

糖尿病预测(深度学习pytorch实现-最新)

本次做的项目是糖尿病的预测,也是来自kaggle上面的一个小项目。根据一个人的怀孕次数、血糖、血压、皮肤厚度、胰岛素指标、身体质量指数、糖尿病谱系指数、年龄等身体参数来预测一个人是否患有糖尿病。

NangoGreen的博客 5358

【数据结构】二叉树遍历(前序/中序/后序/层序-递归与非递归)

数据结构:二叉树遍历(前序/中序/后序/层序-递归与非递归)

金哥的博客 1万+

单相全桥逆变器中比例谐振(PR)控制的优化设计与实现

本文深入探讨了比例谐振(PR)控制在单相全桥逆变器中的优化设计与实现。通过对比PID控制,详细阐述了PR控制在50Hz基波频率处实现无静差跟踪和强抗干扰性的原理。文章提供了从理论建模、参数整定(Kp, Kr, ωc)到仿真验证的完整实战流程,并介绍了准比例谐振(QPR)控制以增强频率鲁棒性,以及多谐振点设计以抑制特定谐波等进阶优化方法,最终实现THD从3%降至1%以内的显著性能提升。

weixin_29056781的博客 176

Obsidian的Git插件设置配置全流程 -- 简单的电脑端多平台同步方案及常见问题

Git同步obsidian的保姆级教程和常见问题

weixin_44370439的博客 1万+

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

关于二叉树的内容,我觉得二叉树最核心的地方就是它的几种遍历方式,基本上所有的问题都是围绕着几种遍历方式来的。因此就在这总结一下这几种遍历方式。 前序遍历 一、简介 前序遍历(DLR),是二叉树遍历的一种,也叫做先根遍历、先序遍历,可记做根左右。 前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树。 若二叉树为空则结束返回,否则...

丸啊~ 6916

Windows下Fortran调用CGNS库的完整踩坑实录:从HDF5、CMake到VS2019+IVF2020的保姆级配置

本文详细记录了在Windows环境下使用Fortran调用CGNS库的完整配置过程,涵盖HDF5安装、CMake配置、VS2019与IVF2020集成等关键步骤。通过实战经验分享,帮助开发者解决常见编译错误和链接问题,实现高效的Fortran与CGNS库集成。

weixin_28707739的博客 349

先序、中序、后序遍历的非递归算法

先序、中序、后序遍历的非递归算法先序遍历中序遍历后序遍历 先序遍历 第一次遇到该结点时输出 public void preOrder(TreeNode root){ if(root==null) return; TreeNode p = root; Stack<TreeNode> stack = new Stack<>(); while(!stack.is...

不想秃头的女ITer的博客 2332

R数据分析:潜在剖面分析LPA的做法与解释

Latent Profile Analysis (LPA) tries to identify clusters of individuals (i.e., latent profiles) based on responses to a series of continuous variables (i.e., indicators). LPA assumes that there are unobserved latent profiles that generate patterns of resp.

Codewar的博客 1万+

YOLOv11改进 | 注意力篇 | YOLOv11引入24年ECCV的自调制特征聚合注意力模块(SMFA),并构建C2PSA_SMFA

1.SMFA介绍1.1 摘要:基于Transformer的图像复原方法由于Transformer的自注意(self-attention,SA)特性能够更好地挖掘非局部信息,从而获得更好的高分辨率图像重建效果,因此具有重要的应用价值。然而,关键点积SA需要大量的计算资源,这限制了其在低功耗器件中的应用。此外,模拟退火机制的低通特性限制了其捕获局部细节的能力,从而导致平滑的重建结果。

tsg6698的博客 952

Java实现二叉树的先序、中序、后序遍历算法

Java实现二叉树的先序、中序、后序遍历算法 一、构建二叉树的存储结构 一棵二叉树的节点结构主要包括三部分:节点的值域,指向左孩子的指针,指向右孩子的指针。由于Java语言没有指针的定义,这里采用属性的方式实现(重写equals方法是为了后续遍历非递归算法的需要,后面会说明)。代码如下: import java.util.Objects; /** * @author:Chris * @date:2021/2/25 * @description 二叉树结点结构 */ public class BiT

weixin_43670251的博客 1820

Mamba-UNet:用于医学图像分割的类似UNet的纯视觉Mamba网络

所提出的Mamba-UNet的架构如图2所示,其灵感来源于UNet [24] 和 Swin-UNet [3]。首先将大小为 H × W × 1 的2D灰度图像分割成类似于ViT和VMamba的块 [5,16],然后转换为维度为 H/4 × W/4 × 16 的1D序列。一个初始的线性嵌入层将特征维度调整为任意大小C。这些块令牌随后通过多个VSS块和块合并层进行处理,以创建分层特征。块合并层负责下采样和维度增加,而VSS块则专注于学习特征表示。

AI浩 7549

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

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

dabusiGin的博客 6341

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

数据结构-二叉树(先序、中序、后序遍历二叉树的非递归算法)

文章目录思路Java 实现 思路 上一篇博文我们讲了二叉树的递归算法,这里我们来写一波二叉树的非递归算法 为什么说遍历二叉树可以用递归 二叉树每个结点都满足某个遍历次序,然后从根结点开始遍历,这个流程非常满足递归的模型,就是一个大的问题按照某种方式可以划分为许多细小的问题,然后这些细小的问题又可以用同样的方式继续划分,直到为空或者说直到有个出口 所有递归可以转化成非递归 那非递归我该如何实现呢?这...

abcnull 的博客 1406

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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

二叉树遍历算法 其中我把递归遍历算法注释掉了,因为比较容易理解。 public class TreeTest { public static void main(String[] args) { Tree tree = initTree(); // DLR(tree); // System.out.println("====="); // LDR(tree); // System.out.println("=====");

程冯冯的博客 2万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java实现二叉树三种遍历算法

二叉树三种遍历方式:先序遍历、中序遍历、后序遍历。 先序遍历思想:

u014663362的专栏 9014

二叉树的先序、中序、后序、层序遍历的递归实现与非递归实现

1.总结深度优先与广度优先的区别 1) 二叉树的深度优先遍历的非递归的通用做法是采用栈,广度优先遍历的非递归的通用做法是采用队列。 2) 深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个结点只能访问一次。要特别注意的是,二叉树的深度优先遍历比较特殊,可以细分为先序遍历、中序遍历、后序遍历。具体说明如下: 先序遍历:对任一子树,先访问根,然后遍历其左子树,最后遍历其右子树。 中序遍...

qq_33271461的博客 1163

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

1.用非递归的方式实现二叉树的先序遍历(LeetCode144): 1、申请一个栈stack,然后将头节点压入stack中。 2、从stack中弹出栈顶节点,打印,再将其右孩子节点(不为空的话)先压入stack中,最后将其左孩子节点(不为空的话)压入stack中。 3、不断重复步骤2,直到stack为空,全部过程结束。 /** * Definition for a binary tree node. * public class TreeNode { * int val; * Tre

lin的博客 373

二叉树的先序、中序、后序、层次遍历的递归以及非递归代码-----Java

本次拟整理一下二叉树的中序、后序、先序、层次遍历的递归以及非递归代码实现, 1.基础知识: 根据访问结点操作发生位置命名: ① NLR:前序遍历(Preorder Traversal 亦称(先序遍历)) ——访问根结点的操作发生在遍历其左右子树之前。 ② LNR:中序遍历(Inorder Traversal) ——访问根结点的操作发生在遍历其左右子树之中(间)。 ③ LRN:后序遍历(Postor...

weixin_44438340的博客 368

二叉树的遍历(JAVA递归和非递归版)

二叉树的遍历(JAVA递归和非递归版)二叉树二叉树的先序遍历二叉树的中序遍历插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 二叉树 若是对二叉树的基本概念有所遗忘,可参考二叉树百...

Chen_programmer的博客 836

用java实现二叉树非递归的前序,中序,后序遍历算法

package BinaryTree; public class TreePoint { public String name; private TreePoint leftNode; private TreePoint rightNode; private TreePoint parent; private boolean visit=false; public TreePo

ji_th的专栏 738

二叉树 非递归 先序遍历 中序遍历 后序遍历 层次遍历

二叉树 中很多问题都是通过遍历的方式来解决的,今天就来谢谢最常见的二叉树非递归遍历。 先定义一下节点的信息: class TreeNode{ public int value; public TreeNode left; public TreeNode right; public TreeNode(int value){ this.value = value; } }

方丈的博客 1154

二叉树之先序、中序、后序遍历,递归与非递归实现

今天学习了二叉树的遍历,以此方式加深印象。 上图 定义Node public static class Node { int value; //节点值 public Node left; //左节点 public Node right; //右节点 public Node(int value) { this.value = value; } } - 先序遍历 定...

晏青_的博客 283

二叉树的7种遍历算法

二叉树的7种遍历算法

zhang_qing_yun的博客 1215

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

前言 二叉树的非递归利用栈实现,栈的特性是先进后出,实现回溯 二叉树的节点定义 private static class TreeNode { int data; TreeNode leftChild; TreeNode rightChild; public TreeNode(int data) { this.data = data; } } 前序遍历 前序遍历的输出顺序是根节点 ->

少年小子的博客 662
上一篇: 深入浅出之正则表达式(二)
下一篇: java中文判断
cdtdx
博客等级 码龄22年 45粉丝 60原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值