一、树型结构
在认识二叉树之前,我们可以先了解一下什么叫树。

数据结构中的树,和我们生活中的树是有类似之处的。其实是一种非线性的数据结构。它具有以下的特点:每个结点有零个或多个子结点;没有父结点的结点称为根结点;每一个非根结点有且只有一个父结点;除了根结点外,每个子结点可以分为多个不相交的子树。

如图,就是一个普通的树形结构,这里我们一定要区分开树和图的区别。

二、二叉树
1、概念:
二叉树也是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成。

二叉树的特点:每个节点的度最多是2。二叉树的子树是有左右之分的,并且次序不可以颠倒。

上图就是一个二叉树的结构。

2、特殊的二叉树
满二叉树:一个二叉树,每一层的节点树都达到了最大值,就是满二叉树。如果一个树有k层,节点数就为(2^k)-1个。


完全二叉树:是由满二叉树引出来的,相比于满二叉树,完全二叉树是树结构的右小角缺少节点。

3、二叉树的遍历:

(下面的遍历结果都以这棵树为例)
(1)先序遍历:
先访问(打印)根节点,递归遍历左子树,递归遍历右子树。

遍历过程:

  • 访问A(打印),再遍历左子树B。

    • B作为D的根节点,访问B(打印),遍历B的左子树D。
    • D作为H的根节点,访问D(打印),遍历D的左子树H。
    • H的左右子树都为空,访问H(打印)。此时B的左子树遍历完,接着遍历B的右子树E
    • B作为E的根节点,访问E(打印),遍历E的左子树(空),遍历E的右子树I。
    • I的左右子树都为空,访问I(打印),此时B的右子树遍历完,A的左子树遍历完。
  • A作为C的根节点,访问C(打印),遍历C的左子树

    • C作为F的根节点,访问F(打印),F的左右子树都为空。此时C的左子树遍历完,接着遍历C的右子树G
    • C作为G的根节点,访问G(打印),G的左右子树都为空。

最后遍历的结果就为:A B D H E I C F G

(2)、中序遍历
先递归遍历左子树,访问根节点,再递归遍历右子树。

遍历过程:

  • 遍历根节点A,A的左子树为B。B的左子树为D。D的左子树为H。H的左子树为空,访问(打印)H。

  • H的根节点为D,访问(打印)D。D的右子树为空。

  • D的根节点为B,访问(打印)B。

    • B的右子树为E。E的左子树为空,访问(打印)E。
    • E的右子树为I,访问(打印)I。
  • A的左子树访问完,访问(打印)A。

  • A的右子树为C,C的左子树又为F。

    • F的左右子树都为空,访问(打印)F。
    • C的左子树访问完,访问(打印)C。
    • C的右子树为G,访问(打印)G。

最后的遍历结果为:H D B E I A F C G

(3)、后序遍历
先递归遍历左子树,再递归遍历右子树,访问根节点。

递归过程:

  • A的左子树为B,B的左子树为D,D的左子树为H,H的左右子树为空,访问(打印)H。
  • D的左子树访问完,右子树为空,访问(打印)D。
  • B的左子树访问完,B的右子树为E。E的左子树为空,右子树为I,访问(打印)I。
  • E的左右子树访问完,访问(打印)E。
  • B的左右子树访问完,访问(打印)B。
  • A的左子树访问完,A的右子树为C,C的左子树为F,F的左右子树为空,访问(打印)F。
  • C的左子树访问完,右子树为G,访问(打印)G。
  • C的左右子树访问完,访问(打印)C。
  • A的左右子树访问完,访问(打印)A。

最后的遍历结果为:H D I E B F G C A

(4)、层序遍历:
一层一层向下遍历,每一层从左到右访问。
遍历结果为:A B C D E F G H I

4、二叉树的表示:

class Node{public char val;//值public Node left;//左子树public Node right;//右子树
}

三、代码实现(递归):
1、先序遍历:

public static void prevOrder(Node root) {if(root == null) {return;}System.out.print(root.val + " ");prevOrder(root.left);prevOrder(root.right);}

2、中序遍历

public static void inOrder(Node root) {if(root == null) {return;}inOrder(root.left);System.out.print(root.val + " ");inOrder(root.right);}

3、后续遍历:

public static void postOrder(Node root) {if(root == null) {return;}postOrder(root.left);postOrder(root.right);System.out.print(root.val+ " ");}

4、层序遍历:

public void levelOrder(TreeNode root) {Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);while (!queue.isEmpty()) {TreeNode cur = queue.poll();System.out.print(cur.val + " ");if(cur.left != null) {queue.offer(root.left);}if(cur.right != null) {queue.offer(root.right);}}}

二叉树遍历方式-先序、中序、后序和层序遍历(JAVA)相关推荐

  1. 二叉树遍历方法——前、中、后序遍历(图解)

    目录 一.前序遍历 (1)递归版本 (2)非递归版本 二.中序遍历 (1)递归版本 (2)非递归版本 三.后序遍历 (1)递归版本 (2)非递归版本 四.总结 五.测试程序 六.程序输出 二叉树的遍历 ...

  2. Python__数据结构与算法——树、二叉树(实现先、中、后序遍历)

    目录 一.树 二.二叉树 树和前面所讲的表.堆栈和队列等这些线性数据结构不同,树不是线性的.在处理较多数据时,使用线性结构较慢,而使用树结构则可以提高处理速度.不过,相对于线性的表.堆栈和队列等线性数 ...

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

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

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

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

  5. 二叉树的前、中、后序遍历

    所谓二叉树遍历是按某种特定规则,依次对二叉树中的节点进行相应的操作,并且每个节点只操作一次.访问结点所做的操作依赖于具体的应用问题. 遍历是二叉树上最重要的运算之一,也是二叉树进行其它运算的基础. 二 ...

  6. 非递归先、中、后序遍历二叉树(C语言)

    文章目录 前言 一.二叉树非递归遍历算法 1.先序遍历 2.中序遍历 3.后序遍历 二.完整程序 三.运行结果实例 前言 本程序采用C语言编写,栈和二叉树的基本操作函数基于严蔚敏老师的<数据结构 ...

  7. 二叉树前、中、后线索化及对应前、中、后序线索化遍历

    二叉树前中后线索化及对应前中后序线索化遍历(图解) 二叉树线索化都是套路,会一种另外两种只是稍微修改一下代码 值得一提的是后序线索化输出,逆序思维将后序线索化看成前序,采用"前序线索化输出& ...

  8. 7-10 先序序列创建二叉树,输出先序序列、中序序列、后序序列并输出叶子结点数 (10 分)

    7-10 先序序列创建二叉树,输出先序序列.中序序列.后序序列并输出叶子结点数 (10 分) 对于给定的二叉树,输出其先序序列.中序序列.后序序列并输出叶子结点数. 输入格式: 二叉树的先序遍历序列. ...

  9. PAT甲级1020 Tree Traversals:[C++题解]树的遍历、由中序序列和后序序列递归建树

    文章目录 题目分析 题目链接 题目分析 题意重述:给定一棵二叉树的后序遍历序列和中序遍历序列,让求层次遍历的序列. 分析: 后序遍历:先 左子树.右子树 ,最后再遍历根结点. 中序遍历:先左子树,再根 ...

  10. 二叉树的构造(前序+中序)---(后序 + 中序)

    二叉树的构造(前序+中序)-(后序 + 中序) 思路:要对前序+中序(后序+中序)的构建树的动态过程要了解,思路比较简单,在了解了这个过程之后,理解下面代码就容易了. 过程 参考图: 前序 + 中序: ...

最新文章

  1. 常用的JQuery数字类型验证正则表达式
  2. Spring Cloud Alibaba---服务注册、发现、管理中心Nacos
  3. eclipse启动tomcat报错
  4. 被人崇拜的欧拉恒等式
  5. 下面关于“栈”的描述,正确的是( )
  6. oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务。...
  7. python中keyboardinterrupt_为什么我不能在python中处理KeyboardInterrupt?
  8. mysql执行ref_MySql执行分析
  9. 2022-03-07 学习docker开发vue前端
  10. python深度学习机器学习必备的学习网站集合!
  11. VUE根据后端返回url链接下载文件
  12. 林大计算机科学考研分数线,2018年北京林业大学考研复试分数线已公布
  13. JS 把时间戳转化成YY-MM-DD
  14. 使用 Python 生成二维码
  15. multiple definition of `_start'
  16. 计算机基础题选择题,计算机基础知识题库选择题.doc
  17. 华强北再也没法生产散装 iPhone 了
  18. mysql插入数据变慢的原因_mysql插入数据变慢的原因
  19. pytorch从hdfs载入模型、从二进制字符串载入模型
  20. QUIC浅析,android开发者模式

热门文章

  1. Spearman 相关性分析法,以及python的完整代码应用
  2. comsol结构力学-应力应变仿真
  3. HTTP状态码:400\500 错误代码(个人总结)
  4. 开源ios街机模拟器
  5. app 自动化 打开app (二)
  6. 虚拟机报错模块“Disk”启动失败。 未能启动虚拟机。
  7. C/C++ 延时函数 (标准库)
  8. 基于深度强化学习的机器人运动控制研究进展 | 无模型强化学习 | 元学习
  9. FHQ-Treap 简介
  10. Android MediaPlayer中的RTSP(一):RTSP简介