java使用递归及迭代方式实现前序遍历 中序遍历 后序遍历 以及实现层序遍历
本文为博主原创,转载请注明出处:
目录:
一。快速理解前序,中序,后序遍历的区别
二。使用递归的方式实现前序,中序,后序遍历
三。 使用迭代的方式实现前序 中序 后序遍历
四。层序遍历
一。快速理解前序,中序,后序遍历的区别
前序遍历:根左右(根在前,从左往右,一棵树的根永远在左子树前面,左子树又永远在右子树前面 )
中序遍历:左根右(根在中,从左往右,一棵树的左子树永远在根前面,根永远在右子树前面)
后序遍历:左右根(根在后,从左往右,一棵树的左子树永远在右子树前面,右子树永远在根前面)
参考一张图可以快速理解三种遍历的顺序

二。使用递归的方式实现前序,中序,后序遍历
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使用递归及迭代方式实现前序遍历 中序遍历 后序遍历 以及实现层序遍历的更多相关文章
- 【算法】二叉树、N叉树先序、中序、后序、BFS、DFS遍历的递归和迭代实现记录(Java版)
本文总结了刷LeetCode过程中,有关树的遍历的相关代码实现,包括了二叉树.N叉树先序.中序.后序.BFS.DFS遍历的递归和迭代实现.这也是解决树的遍历问题的固定套路. 一.二叉树的先序.中序.后 ...
- Java实现二叉树的前序、中序、后序遍历(非递归方法)
在上一篇博客中,实现了Java中二叉树的三种遍历方式的递归实现,接下来,在此实现Java中非递归实现二叉树的前序.中序.后序遍历,在非递归实现中,借助了栈来帮助实现遍历.前序和中序比较类似,也简单 ...
- Java实现二叉树的前序、中序、后序、层序遍历(非递归方法)
在上一篇博客中,实现了Java中二叉树的四种遍历方式的递归实现,接下来,在此实现Java中非递归实现二叉树的前序.中序.后序.层序遍历,在非递归实现中,借助了栈来帮助实现遍历.前序和中序比较类似, ...
- Java实现二叉树的先序、中序、后序、层序遍历(递归和非递归)
二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易 ...
- JAVA下实现二叉树的先序、中序、后序、层序遍历(递归和循环)
import java.util.HashMap; import java.util.LinkedList; import java.util.Map; import java.util.Queue; ...
- 遍历二叉树 - 基于递归的DFS(前序,中序,后序)
上节中已经学会了如何构建一个二叉搜索数,这次来学习下树的打印-基于递归的DFS,那什么是DFS呢? 有个概念就行,而它又分为前序.中序.后序三种遍历方式,这个也是在面试中经常会被问到的,下面来具体学习 ...
- 左神算法基础班4_1&2实现二叉树的先序、中序、后序遍历,包括递归方式和非递归
Problem: 实现二叉树的先序.中序.后序遍历,包括递归方式和非递归方式 Solution: 切记递归规则: 先遍历根节点,然后是左孩子,右孩子, 根据不同的打印位置来确定中序.前序.后续遍历. ...
- LeetCode二叉树的前序、中序、后序遍历(递归实现)
本文用递归算法实现二叉树的前序.中序和后序遍历,提供Java版的基本模板,在模板上稍作修改,即可解决LeetCode144. Binary Tree Preorder Traversal(二叉树前序遍 ...
- 玩透二叉树(Binary-Tree)及前序(先序)、中序、后序【递归和非递归】遍历
基础预热: 结点的度(Degree):结点的子树个数:树的度:树的所有结点中最大的度数:叶结点(Leaf):度为0的结点:父结点(Parent):有子树的结点是其子树的根节点的父结点:子结点/孩子结点 ...
- C++ 手动创建二叉树,并实现前序、中序、后序、层次遍历
二叉树的创建是个麻烦事,我的思路是:首先将一个普通的二叉树转化为满二叉树,其中的空节点用一些标识数据来代替,如此一来,就可以用数组索引来描述数据在二叉树的什么位置了. 比如,数组[2,4,3,1,5, ...
随机推荐
- 微软官方发布的C#开源、免费、实用的Windows工具箱
前言 今天分享一款由微软官方发布的C#开源.免费.实用的Windows工具箱(帮助用户调整和简化Windows系统的体验,从而提高工作效率):Microsoft PowerToys. 项目介绍 Mic ...
- 深入 K8s 网络原理(二)- Service iptables 模式分析
目录 1. 概述 2. 准备 Service 和 Pods 资源 3. K8s 里 Service 的实现原理 3.1 kube-proxy 组件 3.2 iptables 简介 3.3 iptabl ...
- CSP_J
- python tkinter使用(十一)
python tkinter使用(十一) 本篇文章主要讲下tkinter 窗口的一些属性,以及实现无法关闭的窗口中遇到的一些问题. #!/usr/bin/python3 # -*- coding: U ...
- ModuleNotFoundError: No module named '_pytest.resultlog'
新环境运行Python时报错 ModuleNotFoundError: No module named '_pytest.resultlog' 上网查,看到解决方法 https://www.cnbl ...
- 【K8S系列】快速初始化⼀个最⼩集群
序言 走得最慢的人,只要不丧失目标,也比漫无目的地徘徊的人走得快. 文章标记颜色说明: 黄色:重要标题 红色:用来标记结论 绿色:用来标记一级重要 蓝色:用来标记二级重要 希望这篇文章能让你不仅有一定 ...
- Spark SQL快速入门
Spark SQL快速入门 1.概述 spark SQL是Apache用于处理结构化数据的模块.其中包含SQL.DataFrame API.DataSet API,意味着开发人员可以在不同的API之间 ...
- curl使用小记(二)——远程下载一张图片
目录 1. 概述 2. 实例 3. 参考 1. 概述 在之前的文章<curl使用小记(一)>中论述了命令行工具curl的基本使用.除此之外,curl还提供了能够直接供程序调用的模块库接口l ...
- Kafka 源码解析:Server 端的运行过程
摘要:Kafka网络模块之Server端,介绍Server端启动.接收请求和处理请求的过程. 本文分享自华为云社区<Kafka网络模块-Server端>,原文作者:中间件小哥 . Sock ...
- 详解CNN实现中文文本分类过程
摘要:本文主要讲解CNN实现中文文本分类的过程,并与贝叶斯.决策树.逻辑回归.随机森林.KNN.SVM等分类算法进行对比. 本文分享自华为云社区<[Python人工智能] 二十一.Word2Ve ...