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

  目录:

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

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

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

    四。层序遍历

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

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

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

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

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

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

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. 一文讲透消息队列RocketMQ实现消费幂等

    这篇文章,我们聊聊消息队列中非常重要的最佳实践之一:消费幂等. 1 基础概念 消费幂等是指:当出现 RocketMQ 消费者对某条消息重复消费的情况时,重复消费的结果与消费一次的结果是相同的,并且多次 ...

  2. 高斯朴素贝叶斯(Gaussian Naive Bayes)原理与实现——垃圾邮件识别实战

    朴素贝叶斯(Naive Bayes): 根据贝叶斯定理和朴素假设提出的朴素贝叶斯模型. 贝叶斯定理: 朴素假设(特征条件独立性假设): 代入可知朴素贝叶斯模型计算公式: 因为朴素贝叶斯是用来分类任务, ...

  3. Python——Html(语法、格式、段落、文字处理、路径、超链接、图片、视频)

    HTML(Hyper Text Markup Language超文本标记语言)用特殊的一种标签把需要特殊展示出来的内容圈起来.这就是标记语言语法规则 <标记>被标记的内容</标记&g ...

  4. 2024年,在风云际会的编程世界里,窥探Java的前世今生,都说它穷途末路,我认为是柳暗花明!

    2024年,在风云际会的编程世界里,窥探Java的前世今生,都说它穷途末路,我认为是柳暗花明! 文编|JavaBuild 哈喽,大家好呀!我是JavaBuild,以后可以喊我鸟哥,嘿嘿!俺滴座右铭是不 ...

  5. Feign源码解析5:loadbalancer

    背景 经过前面几篇的理解,我们大致梳理清楚了FeignClient的创建.Feign调用的大体流程,本篇会深入Feign调用中涉及的另一个重要组件:loadbalancer,了解loadbalance ...

  6. 通过鼠标拖拉获取图片原像素的两个点坐标vue

    <template> <div> <img class="no-drag" ref="image" src="https ...

  7. spring-mvc 系列:获取请求参数(ServletAPI、形参、RequestParam、RequestHeader、CookieValue、POJO等方式)

    目录 一.通过 ServletAPI 获取 二.通过控制器方法的形参获取请求参数 三.@RequestParam 四.@RequestHeader 五.@CookieValue 六.通过 POJO 获 ...

  8. 4种Springboot RestTemplate 服务里发送HTTP请求用法

    摘要: RestTemplate与REST资源交互的方法涵盖了HTTP请求方法,包括get, post, put, delete. 本文分享自华为云社区<Springboot RestTempl ...

  9. 当你运行npm run命令时,会发生什么?

    摘要:今天我们来聊一聊运行npm run命令之后会发生什么. 本文分享自华为云社区<运行npm run命令的时候会发生什么?>,作者:gentle_zhou . 先前发了一篇"运 ...

  10. ServiceWorker工作机制与生命周期:资源缓存与协作通信处理

    在 <web messaging与Woker分类:漫谈postMessage跨线程跨页面通信>介绍过ServiceWorker,这里摘抄跟多的内容,补全 Service Worker 理解 ...