前序、中序、后序遍历思想

  1. 前序遍历的顺序是根左右,即先遍历根节点,接着遍历左节点,最后遍历右节点;
  2. 中序遍历的顺序是左根右,即先遍历左节点,接着遍历根节点,最后遍历右节点;
  3. 后序遍历的顺序是左右根,即先遍历左节点,接着遍历右节点,最后遍历根节点。
  4. 总结:前序、中序、后序遍历就是看访问根节点的位置

举例说明

假设一颗如图所示的二叉树,如何写出前序、中序、后序遍历呢?

二叉树示意图

我们可以将上图转化为如图所示的一个个子二叉树。

子二叉树划分示意图

那么根据前序遍历的特点(根左右),先A->B,这时,将B作为根节点,遍历B的左子树,即B->D,此时,D已是叶子节点,接着遍历B的右子树,B->E,此时,E也是叶子节点了,并且对于A来说,左子树已全部遍历完毕,接着遍历A的右子树,A->C,这时,将C作为根节点,遍历C的左子树,C->F,此时,F已是叶子节点,又C没有右子树,那么对于A节点来说右子树也遍历完成,结束,遍历顺序为:A->B->D->E->C->F

同样,依据中序遍历的特点(左根右),可以写出遍历顺序为:D->B->E->A->F->C

最后,依据后序遍历特点(左右根),可以写出遍历顺序为:D->E->B->F->C->A

代码实现

首先,我们需要利用代码定义一颗二叉树,即表述出节点之间的关系,代码如下:

class TreeNode {//存入的值String value;//左子树父节点,默认是nullTreeNode left;//右子数父节点,默认是nullTreeNode right;public TreeNode(String value) {this.value = value;}public TreeNode(String value, TreeNode left, TreeNode right) {this.value = value;this.left = left;this.right = right;}
}

前序遍历代码(递归法):

    //前序遍历   public void preOrder() {//先输出父节点System.out.print(this.value + " ");//递归左子树if (this.left != null) {this.left.preOrder();}//递归右子树if (this.right != null) {this.right.preOrder();}}

中序遍历代码(递归法):

    //中序遍历public void midOrder() {//递归左节点if (this.left != null) {this.left.midOrder();}//输出父节点System.out.print(this.value + " ");//递归右节点if (this.right != null) {this.right.midOrder();}}

后序遍历代码(递归法):

    //右序遍历public void afterOrder() {//递归左节点if (this.left != null) {this.left.afterOrder();}//递归右节点if (this.right != null) {this.right.afterOrder();}//输出父节点System.out.print(this.value + " ");}

整体代码:

public class Solution {public static void main(String[] args) {//创建节点TreeNode rootA = new TreeNode("A");TreeNode nodeB = new TreeNode("B");TreeNode nodeC = new TreeNode("C");TreeNode nodeD = new TreeNode("D");TreeNode nodeE = new TreeNode("E");TreeNode nodeF = new TreeNode("F");//描述关系rootA.left = nodeB;rootA.right = nodeC;nodeB.left = nodeD;nodeB.right = nodeE;nodeC.left = nodeF;System.out.print("前序遍历->");rootA.preOrder();System.out.println();System.out.print("中序遍历->");rootA.midOrder();System.out.println();System.out.print("后序遍历->");rootA.afterOrder();}
}class TreeNode {//存入的值String value;//左子树父节点,默认是nullTreeNode left;//右子数父节点,默认是nullTreeNode right;public TreeNode(String value) {this.value = value;}public TreeNode(String value, TreeNode left, TreeNode right) {this.value = value;this.left = left;this.right = right;}//前序遍历public void preOrder() {//先输出父节点System.out.print(this.value + " ");//递归左子树if (this.left != null) {this.left.preOrder();}//递归右子树if (this.right != null) {this.right.preOrder();}}//中序遍历public void midOrder() {//递归左节点if (this.left != null) {this.left.midOrder();}//输出父节点System.out.print(this.value + " ");//递归右节点if (this.right != null) {this.right.midOrder();}}//右序遍历public void afterOrder() {//递归左节点if (this.left != null) {this.left.afterOrder();}//递归右节点if (this.right != null) {this.right.afterOrder();}//输出父节点System.out.print(this.value + " ");}
}

测试结果:

二叉树的前序、中序、后序遍历(附java代码)相关推荐

  1. java中二叉树_Java工程师面试1000题224-递归非递归实现二叉树前、中、后序遍历...

    224.使用递归和非递归实现二叉树的前.中.后序遍历 使用递归来实现二叉树的前.中.后序遍历比较简单,直接给出代码,我们重点讨论非递归的实现. class Node { public int valu ...

  2. C++实现二叉树 前、中、后序遍历(递归与非递归)非递归实现过程最简洁版本

    本文并非我所写,是复制的该链接中的内容: 最近学习二叉树,想编程实现递归和非递归的实现方式: 递归的方式就不说了,因为大家的递归程序都一样:但是对于非递归的实现方式, 根据这几天的查阅资料已看到差不多 ...

  3. 【LeetCode | 二叉树前、中、后序遍历{迭代法}实现】

    1.前序遍历 // 解题思路:利用栈的原理实现以迭代方法来前序遍历(根左右)二叉树 class Solution { public:vector<int> preorderTraversa ...

  4. java数据结构学习笔记-二叉树前、中、后序遍历

    public class BinaryTreeDemo {public static void main(String args[]){Employee emp1= new Employee(1,&q ...

  5. 【LeetCode | 二叉树前、中、后序遍历{递归法}实现】

    1.前序遍历 #include <iostream> #include <vector> #include <queue> #include <algorit ...

  6. 二叉树前、中、后序线索化及遍历

    public class ThreadedBinaryTree {public static void main(String[] args){Heronodes node1=new Heronode ...

  7. 二叉树的前序中序后序遍历

    二叉树的前序中序后序遍历 二叉树的遍历 前序遍历 中序遍历 后序遍历 总结 二叉树的遍历 二叉树的遍历有前序遍历,中序遍历,后序遍历三种. 今天我把二叉树的遍历方法给大家总结一下,也算对我自己学习的一 ...

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

    本文主要介绍二叉树前序中序后序遍历的非递归写法 在探讨如何写出二叉树的前序中序后序遍历代码之前,我们先来明确一个问题,前序中序后序遍历根据什么区分? 二叉树的前序中序后序遍历,是相较根节点说的.最先遍 ...

  9. 二叉树的前序中序后序遍历java代码实现

    1.前序遍历概述 前序遍历(VLR) 是二叉树遍历的一种,也叫做先根遍历.先序遍历.前序周游,可记做根左右.前序遍历首先访问根结点然后遍历左子树,最后遍历右子树. 若二叉树为空则结束返回,否则: (1 ...

  10. 二叉树遍历(递归实现前序/中序/后序遍历)

    1. 准备工作 我们先定义一棵普通的二叉树,如下图 2. 前序遍历 通过递归进行遍历: 如果二叉树为空,则操作返回: 如果非空,否则从根结点开始,然后遍历左子树,再遍历右子树. 前序遍历的结果是:AB ...

最新文章

  1. CBitmapButton的使用(转)
  2. SEO研究:网站结构
  3. opencv3.2.0 Cmake 3.8.0 + tdm-gcc-5.1.0-3 编译问题 highgui _Win32_IE
  4. HTML标签详解之格式标签
  5. HDU4372(第一类斯特林数)
  6. 2020杭电多校(二) New Equipments(最小费用最大流)
  7. Java并发编程实战~Balking模式
  8. 通俗易懂设计模式解析——代理模式
  9. 新闻组的查看方法-----转载
  10. java final class 性能_java中final修饰基本变量后的效率问题
  11. 单片机电源自动切换电路,mos双电源自动切换电路,电池与usb供电自动切换电路
  12. 国外优秀技术网站推荐
  13. 计算机与英语教学的论文开题报告,英语教学论文开题报告
  14. paip.python错误解决 0x64024e96 指令引用的 0x00000135 内存。该内存不能为 read。
  15. 微信砍价小程序活动软件制作功能包含哪些方面?
  16. C语言 | 输出魔方矩阵
  17. List集合去重的常见及常用的四种方式
  18. 关于微信小程序web开发者工具模拟器出现空白问题
  19. 鞍点【C语言】完整可用
  20. 【原】JUNIT 源码分析之TestSuite

热门文章

  1. 《MySQL必知必会》知识点总结
  2. BIOS无法进入的问题
  3. openwrt中br-lan,eth0,eth0.1,eth0.2等各种网络接口
  4. 同步和异步的区别及优缺点 通俗理解
  5. 人工智能工程师需要了解哪些知识体系
  6. Unity3D 提取游戏资源的三个工具支持 Unity5
  7. 取得两个List的交集,retainAll()方法
  8. 字符串匹配: BF与KMP算法
  9. 一文搞懂 python 中守护线程与非守护线程
  10. C++ 重载操作符<<实现cout定位输出以及设置颜色:cout<<Goto(x,y)<<setC(color)<<123<<cr;