本文为博主原创,转载请注明出处:

  目录:

    一。快速理解前序,中序,后序遍历的区别

    二。使用递归的方式实现前序,中序,后序遍历

    三。 使用迭代的方式实现前序 中序 后序遍历

    四。层序遍历

一。快速理解前序,中序,后序遍历的区别

前序遍历:根左右(根在前,从左往右,一棵树的根永远在左子树前面,左子树又永远在右子树前面 )

中序遍历:左根右(根在中,从左往右,一棵树的左子树永远在根前面,根永远在右子树前面)

后序遍历:左右根(根在后,从左往右,一棵树的左子树永远在右子树前面,右子树永远在根前面)

参考一张图可以快速理解三种遍历的顺序

二。使用递归的方式实现前序,中序,后序遍历

package com.example.test.tree;

public class TreeNode {
// 树的根结点值
int val;
// 根节点对应的左节点
TreeNode left = null;
// 根节点对应的右节点
TreeNode right = null;
public TreeNode(int val){
this.val = val;
} /**
* 树的前序便利:根节点--〉左节点---〉右节点
* @param root
*/
public static void preOrder(TreeNode root) {
if (root == null) {
return;
}
System.out.print(root.val + " ");
preOrder(root.left);
preOrder(root.right);
} /**
* 树的中序遍历 : 左节点--〉中节点 --〉 右节点
* @param root
*/
public static void middleOrder(TreeNode root){
if (root ==null){return;}
middleOrder(root.left);
System.out.print(root.val+ " ");
middleOrder(root.right);
} /**
* 树的后序遍历: 左节点--〉右节点 --> 根节点
* @param root
*/
public static void afterOrder(TreeNode root){
if (root == null){return;}
afterOrder(root.left);
afterOrder(root.right);
System.out.print(root.val+ " ");
} public static void main(String[] args) {
TreeNode root = new TreeNode(20);
TreeNode node1 = new TreeNode(4);
TreeNode node2 = new TreeNode(5);
TreeNode node3 = new TreeNode(8);
TreeNode node4 = new TreeNode(2);
TreeNode node5 = new TreeNode(7);
TreeNode node6 = new TreeNode(12);
TreeNode node7 = new TreeNode(3);
TreeNode node8 = new TreeNode(9);
root.left = node1;
root.right = node2;
node1.left = node3;
node1.right = node4;
node2.left = node5;
node2.right = node6;
node3.left = node7;
node4.right = node8;
preOrder(root);
System.out.println();
middleOrder(root);
System.out.println();
afterOrder(root);
} }

三。 使用迭代的方式实现前序 中序 后序遍历

package com.example.test.tree;

import java.util.Stack;

public class TreeNode {
// 树的根结点值
int val;
// 根节点对应的左节点
TreeNode left = null;
// 根节点对应的右节点
TreeNode right = null; public TreeNode(int val) {
this.val = val;
} /**
* 前序遍历:使用stack 记录递归路径,须保证左子节点先出栈
*
* @param root
*/
public static void preOrder2(TreeNode root) {
if (root != null) {
Stack<TreeNode> stack = new Stack<>();
stack.add(root);
while (!stack.isEmpty()) {
root = stack.pop();
if (root != null) {
System.out.print(root.val + " ");
stack.push(root.right);
stack.push(root.left);
}
}
}
} /**
* 中序遍历:将左子节点入栈,出栈打印值,然后添加右子节点
*
* @param root
*/
public static void middleOrder2(TreeNode root) {
if (root != null) {
Stack<TreeNode> stack = new Stack<>();
while (!stack.isEmpty() || root != null)
if (root != null) {
stack.push(root);
root = root.left;
} else {
root = stack.pop();
System.out.print(root.val + " ");
root = root.right;
}
}
} /**
* 后序遍历
* @param root
*/
public void afterOrder2(TreeNode root) {
TreeNode cur, pre = null; Stack<TreeNode> stack = new Stack<>();
stack.push(root); while (!stack.empty()) {
cur = stack.peek();
if ((cur.left == null && cur.right == null) || (pre != null && (pre == cur.left || pre == cur.right))) {
System.out.print(cur.val + "->");
stack.pop();
pre = cur;
} else {
if (cur.right != null)
stack.push(cur.right);
if (cur.left != null)
stack.push(cur.left);
}
}
} public static void main(String[] args) {
TreeNode root = new TreeNode(20);
TreeNode node1 = new TreeNode(4);
TreeNode node2 = new TreeNode(5);
TreeNode node3 = new TreeNode(8);
TreeNode node4 = new TreeNode(2);
TreeNode node5 = new TreeNode(7);
TreeNode node6 = new TreeNode(12);
TreeNode node7 = new TreeNode(3);
TreeNode node8 = new TreeNode(9);
root.left = node1;
root.right = node2;
node1.left = node3;
node1.right = node4;
node2.left = node5;
node2.right = node6;
node3.left = node7;
node4.right = node8;
preOrder2(root);
System.out.println();
middleOrder2(root);
System.out.println();
afterOrder2(root);
} }

四。层序遍历

 /**
* 层序遍历
* @param root
*/
public static void levelOrder(TreeNode root) {
if (root == null) {
return;
}
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(root);
while (!queue.isEmpty()) {
TreeNode node = queue.poll();
System.out.print(node.val + "->"); if (node.left != null) {
queue.add(node.left);
}
if (node.right != null) {
queue.add(node.right);
}
} }

java使用递归及迭代方式实现前序遍历 中序遍历 后序遍历 以及实现层序遍历的更多相关文章

  1. 【算法】二叉树、N叉树先序、中序、后序、BFS、DFS遍历的递归和迭代实现记录(Java版)

    本文总结了刷LeetCode过程中,有关树的遍历的相关代码实现,包括了二叉树.N叉树先序.中序.后序.BFS.DFS遍历的递归和迭代实现.这也是解决树的遍历问题的固定套路. 一.二叉树的先序.中序.后 ...

  2. Java实现二叉树的前序、中序、后序遍历(非递归方法)

      在上一篇博客中,实现了Java中二叉树的三种遍历方式的递归实现,接下来,在此实现Java中非递归实现二叉树的前序.中序.后序遍历,在非递归实现中,借助了栈来帮助实现遍历.前序和中序比较类似,也简单 ...

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

      在上一篇博客中,实现了Java中二叉树的四种遍历方式的递归实现,接下来,在此实现Java中非递归实现二叉树的前序.中序.后序.层序遍历,在非递归实现中,借助了栈来帮助实现遍历.前序和中序比较类似, ...

  4. Java实现二叉树的先序、中序、后序、层序遍历(递归和非递归)

    二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易 ...

  5. JAVA下实现二叉树的先序、中序、后序、层序遍历(递归和循环)

    import java.util.HashMap; import java.util.LinkedList; import java.util.Map; import java.util.Queue; ...

  6. 遍历二叉树 - 基于递归的DFS(前序,中序,后序)

    上节中已经学会了如何构建一个二叉搜索数,这次来学习下树的打印-基于递归的DFS,那什么是DFS呢? 有个概念就行,而它又分为前序.中序.后序三种遍历方式,这个也是在面试中经常会被问到的,下面来具体学习 ...

  7. 左神算法基础班4_1&2实现二叉树的先序、中序、后序遍历,包括递归方式和非递归

    Problem: 实现二叉树的先序.中序.后序遍历,包括递归方式和非递归方式 Solution: 切记递归规则: 先遍历根节点,然后是左孩子,右孩子, 根据不同的打印位置来确定中序.前序.后续遍历. ...

  8. LeetCode二叉树的前序、中序、后序遍历(递归实现)

    本文用递归算法实现二叉树的前序.中序和后序遍历,提供Java版的基本模板,在模板上稍作修改,即可解决LeetCode144. Binary Tree Preorder Traversal(二叉树前序遍 ...

  9. 玩透二叉树(Binary-Tree)及前序(先序)、中序、后序【递归和非递归】遍历

    基础预热: 结点的度(Degree):结点的子树个数:树的度:树的所有结点中最大的度数:叶结点(Leaf):度为0的结点:父结点(Parent):有子树的结点是其子树的根节点的父结点:子结点/孩子结点 ...

  10. C++ 手动创建二叉树,并实现前序、中序、后序、层次遍历

    二叉树的创建是个麻烦事,我的思路是:首先将一个普通的二叉树转化为满二叉树,其中的空节点用一些标识数据来代替,如此一来,就可以用数组索引来描述数据在二叉树的什么位置了. 比如,数组[2,4,3,1,5, ...

随机推荐

  1. SpringBoot-Validate优雅的实现参数校验,详细示例~

    1.是什么? 它简化了 Java Bean Validation 的集成.Java Bean Validation 通过 JSR 380,也称为 Bean Validation 2.0,是一种标准化的 ...

  2. GaussDB(DWS)中的分布式死锁问题实践

    本文分享自华为云社区<GaussDB(DWS)中的分布式死锁问题实践>,作者: 他强由他强 . 1.什么是分布式死锁 分布式死锁是相对于单机死锁而言,一个事务块中的语句,可能会分散在集群里 ...

  3. java之switch用法

    多条件判断,判断条件是等值判断时,可以用switch 比如: 变量level=0时,输出"非会员" 变量level=1时,输出"打9折" 变量level=2时, ...

  4. (数据科学学习手札156)地图可视化神器kepler.gl 3.0版本发布

    本文已收录至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,地图可视化神器kepler.gl终于带 ...

  5. CTFshow元旦水友赛 CRYPTO WP

    CRYPTO 新年祝福 题目 加油!为跨年夜还在努力的自己加油! ctfshow全体工作人员,祝您学业有成,阖家幸福! 解码下面base64 Y3Rmc2hvd3vmlK/ku5jlrp3lj6Pku ...

  6. IOS关闭锁屏状态下左滑相机

    IOS 锁屏状态下,左滑就会打开相机,还不能关闭.这种功能说真的,没有啥用,还很麻烦.看了一圈教程,写的也是没写全.自己再写一个,以后换手机还用得上. 注:此方法会导致微信的扫一扫不可用 1.找到&q ...

  7. 一文读懂Spring框架中依赖注入流程

    想读懂Spring的依赖注入流程,我们先简单了解一下Ioc和DI是什么? IoC和DI Ioc-Inversion of Control,即"控制反转",不是什么技术,而是一种设计 ...

  8. .NET技术分享日活动-202202

    2022年02月19日下午,个人组织举办了山东地区的第四次.NET技术分享日活动.主要包含.NET常用技术.低代码.大前端.大数据和工作流等五个技术领域. 本次技术分享日活动面向了山东地区广大的.NE ...

  9. 【Pandas】groupby连用的count()和size()的区别

    groupby连用的count()和size()的区别 count() 计算的是 value(数值): size() 计算的是 size(个数) 我们有以下表: size() age = df.gro ...

  10. 谁说AI看不懂视频?

    摘要:人工智能在视觉领域发展趋于成熟,基于人工智能的视频内容分析能从根本上解决传统内容分析方法性能低下的问题,视频分析开启2.0智能时代. 视频数据量激增,数据处理和内容运营成本居高不下 云计算.大数 ...