什么是二叉树?

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

根据二叉树的概念,可以知道二叉树有以下两个特点:

1.每个节点最多有两棵子树,即二叉树不存在度大于二的节点。
2.二叉树的子树有左右之分,其子树的次序不能颠倒,因此二叉树是有序树。

二叉树的基本形态:

上图给出了几种特殊的二叉树形态,从左往右依次是:空树、只有根节点的二叉树、节点只有左子树、节点只有右子树,一般二叉树都是由上述基本形态结合而成。

两种特殊的二叉树:

  1. 满二叉树:一个二叉树,如果每一层的节点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为k,且节点总数为2^k-1 ,则它就是满二叉树。
  2. 完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为k的,有n个节点的二叉树,当且仅当其每一个节点都与深度为k的满二叉树中编号从那1至n的节点一一对应时称为完全二叉树,满二叉树是一种特殊的完全二叉树。

    对二叉树进行了基本的了解后,现在开始介绍二叉树的遍历。

请你先想一下什么是遍历?
遍历就是对目标集合里的每个元素都过一遍,当然在需要的时候可以在经过的时候对元素进行需要的操作。

集合如果是线性表这样的结构的话,遍历就很简单,因为线性表只有前后关系,所以你要嘛从前往后遍历,要嘛从后往前遍历。但是想遍历二叉树这样递归定义的结构就需要人为的指定遍历顺序,因为需要写成程序去执行所以这个顺序必须有规律(没有规律就没法抽象成代码)。

所以二叉树的遍历被规定为以下两种模式:
1.深度优先遍历
2.广度优先遍历 —— 层序遍历

今天先来介绍深度优先的遍历,它的遍历路线如下:

就是先遍历左子树,后遍历右子树。

大家仔细观察会发现,在遍历的过程中,我们会三次经过一个节点:

对于图中B这个节点:从根节点(A)开始,找到A的左孩子(B),在以B为根节点去找B的左子树,直到找完左子树回到 B,再去找B的右子树,右子树找完回到B,作为根节点A的左子树就找完了。既然可以三次经过B那么意味着我们有三次机会对B节点操作:
1.对B节点操作,找B的左子树,回到B,找B的右子树,回到B; 2.先不对B操作,先去找B的左子树,找完回到B,对B操作,再去找B的右子树,最后回到B; 3.先不对B操作,去找B的左子树,回到B,去找B的右子树,最后回到B对B操作。
对于 1 ,我们称这种顺序为先序遍历
对于 2 , 我们称这种顺序为中序遍历
对于 3 , 我们称这种顺序为后序遍历
画图理解就是这样:

下面我们通过代码理解
代码中打造的树

public class TreeTraversal {//打如图的树public static TreeNode buildTree1() {// 让大家练习前中后序的树TreeNode a = new TreeNode('a');TreeNode b = new TreeNode('b');TreeNode c = new TreeNode('c');TreeNode d = new TreeNode('d');TreeNode e = new TreeNode('e');TreeNode f = new TreeNode('f');TreeNode g = new TreeNode('g');TreeNode h = new TreeNode('h');TreeNode i = new TreeNode('i');TreeNode j = new TreeNode('j');TreeNode k = new TreeNode('k');TreeNode l = new TreeNode('l');TreeNode m = new TreeNode('m');TreeNode n = new TreeNode('n');a.left = b; a.right = c;b.left = d; b.right = e;c.left = f; c.right = g;d.left = null; d.right = h;e.left = null; e.right = null;f.left = i; f.right = j;g.left = null; g.right = k;h.right = l;j.left = m;m.left = n;return a;}//前序遍历public static void preorder(TreeNode root){//当节点为空时就是递归的出口if(root == null){return;}//第一次经过就对节点操作System.out.printf("%c ",root.val);preorder(root.left);preorder(root.right);}//中序遍历public static void inorder(TreeNode root) {if (root == null) {return;}inorder(root.left);//遍历完左子树之后对节点操作System.out.printf("%c ", root.val);inorder(root.right);}// 后序遍历public static void postorder(TreeNode root) {if (root == null) {return;}postorder(root.left);postorder(root.right);//左右子树都遍历完最后对节点操作System.out.printf("%c ", root.val);}public static void main(String[] args) {TreeNode root = buildTree1();System.out.println("=====前序遍历======");preorder(root);System.out.println("\n=====中序遍历======");inorder(root);System.out.println("\n=====后序遍历======");postorder(root);}
}

运行结果:

以上就是对二叉树及其前序,中序,后续遍历的介绍,如果理解有偏差还请看官指正。

用Java描述数据结构之二叉树,前序遍历,中序遍历,后序遍历相关推荐

  1. 数据结构之---二叉树前序,中序,后序

    转载:https://blog.csdn.net/u013834525/article/details/80421684

  2. 二叉树前序,中序,后序遍历的迭代实现,实现思路及代码

    用Java描述数据结构之二叉树,前序遍历,中序遍历,后序遍历这篇博客中我介绍了二叉树的相关概念和递归实现的二叉树的前中后序遍历.今天来介绍非递归迭代版遍历的思路及实现代码. 首先我们要明白所谓遍历就是 ...

  3. 二叉树的遍历(前序、中序、后序、已知前中序求后序、已知中后序求前序)

    二叉树的遍历(前序.中序.后序.已知前中序求后序.已知中后序求前序)   之前的一篇随笔(二叉树.前序遍历.中序遍历.后序遍历)只对二叉树的遍历进行了笼统的描述,这篇随笔重点对前.中.后序的遍历顺序进 ...

  4. 中序和后序(前序和中序)序列确定一颗二叉树

    概述 中序遍历的结果和后序遍历的结果可以确定一颗二叉树 或者前序遍历和中序遍历 但是前序后和后序无法确定一颗二叉树 由先序序列和后序序列不能唯一确定一棵二叉树,因无法确定左右子树两部分. 例如 俩二叉 ...

  5. [Leedcode][JAVA][第105题][从前序与中序遍历序列构造二叉树][栈][递归][二叉树]

    [问题描述][中等] 根据一棵树的前序遍历与中序遍历构造二叉树.注意: 你可以假设树中没有重复的元素.例如,给出前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = ...

  6. 树的基本概念和遍历规则 数据结构和算法 二叉树遍历(前序、中序、后序、层次、深度优先、广度优先遍历)

    zsychanpin 博客园 首页 新随笔 联系 订阅 管理 树的基本概念和遍历规则 树的递归定义 树是n(n>0)个结点的有限集,这个集合满足下面条件:       ⑴有且仅有一个结点没有前驱 ...

  7. 二叉树广度优先搜索、深度优先搜索(前序、中序、后序)遍历,动图详解-Java/Kotlin双版本代码

    自古逢秋悲寂寥,我言秋日胜春朝 二叉树结构说明 本博客使用树节点结构,如下所示: Kotlin 版本 class TreeNode(var value: String, var leftNode: T ...

  8. 【树】二叉树遍历算法(深度优先、广度优先遍历,前序、中序、后序、层次)及Java实现...

    [树]二叉树遍历算法(深度优先.广度优先遍历,前序.中序.后序.层次)及Java实现 目录 一.前序遍历 二.中序遍历 三.后序遍历 四.层次遍历 遍历的作用 二叉树是一种非常重要的数据结构,很多其它 ...

  9. 二叉树深度优先 java_二叉树遍历(前序、中序、后序、层次、深度优先、广度优先遍历) java实现...

    二叉树是一种非常重要的数据结构,非常多其他数据结构都是基于二叉树的基础演变而来的.对于二叉树,有深度遍历和广度遍历,深度遍历有前序.中序以及后序三种遍历方法,广度遍历即我们寻常所说的层次遍历.由于树的 ...

最新文章

  1. PAT甲级1027 Colors in Mars :[C++题解]进制位
  2. linux关闭和开启防火墙(Ubuntu、centos、Redhat)
  3. 吴恩达机器学习笔记:(二)代价函数
  4. Linux 创建桌面应用程序图标 (Ubuntu 18.04 16.04、Linux Mint、Deepin、等均适用 )
  5. 阿里巴巴飞天大数据架构体系与Hadoop生态系统
  6. 带有审计表的实体框架核心(EF Core)
  7. python读音有道-Python实现有道翻译+语音播报
  8. C语言关系运算和逻辑运算
  9. w ndows7旗舰版怎么重装系统,windows7旗舰版iso怎么安装
  10. 理解ES6中的暂时死区(TDZ)
  11. KOL营销之痛点难点
  12. XGRegressor参数设置
  13. 函数的参数和函数的值
  14. Unity LWRP修改Blit Shader来使Camera的Depth Only生效
  15. 解决浏览器不支持display:flex的问题
  16. Houdini文件格式介绍指南
  17. python 基础内置函数表及简单介绍
  18. 原生小程序地址管理--抖音小程序(详细)
  19. SILK : SILK_RTP_PayloadFormat 中文翻译
  20. 手把手教你修改定制WM5的ROM(带图和相关工具)

热门文章

  1. AngularJS日期格式化
  2. KOA中的ejs的基本使用
  3. 查询url包含的字符串参数(js高程笔记)
  4. JS 进阶知识点及常考面试题
  5. libfacedetection库 yufacedetectnet-open-v1.prototxt详解
  6. mysql建表主键_常见的MySQL命令大全second
  7. 剑指offer-JZ54 二叉搜索树的第k个节点(附思路)
  8. linux shell变量作用域,Shell变量的作用域:Shell全局变量、环境变量和局部变量
  9. MyBatis复习(五):获取多表关联查询结果
  10. php及时获取zabbix告警,zabbix邮件告警python脚本代码