阅读本文前应对树的结构有所了解,起码得知道根节点,左子树和右子树。其次就是,本文采用的对二叉树进行遍历时用的是递归的方法。
遍历:沿着特定的路径,对每一个节点只进行一次访问。然后因对根节点的访问顺序的不同,分为前、中、后三种遍历方式
以下的遍历结果基于上图
一、前序遍历
1.遍历顺序:根节点——>左子树——>右子树
在这里需要注意的是,当访问了根节点之后,后面对左右子树进行访问的时候,仍需要遵循先访问子树中的根节点,并且是左子树全都访问完之后才对右子树进行访问。
2.遍历结果:G DAFE MHZ(给根节点加粗显示)
二、中序遍历
1.遍历顺序:左子树——>根节点——>右子树
其实中序遍历就是从树的最后一层,最左边的那个节点开始,遵循从左到右的顺序对节点进行访问,即最左下角的节点访问之后再对它的父节点进行访问,若当前父节点有右子树,则对它进行访问,否则再对当前父节点的父节点进行访问,也就是递归。便于理解,对树进行扩充
在这棵树中,左下角无节点,则从A出发,再访问B,然后递归,访问A的父节点D,此时D的左子树已全部完成访问,接下来就是对D的右子树进行访问,还是从最后一层开始,EF,此时根节点G的左子树已全部完成访问,便轮到G,之后用同样的方法对G的右子树进行访问
其实中序的访问顺序也就是从最后一层开始:左下——>正上——>右下(左下和右下在同一层),完成之后再从正上的这个节点循环
2.遍历结果:ABDEF G. CHMZ
三、后序遍历
1.遍历顺序:左子树——>右子树——>根节点
仿照中序遍历的思路,那后序遍历就是,从最后一层的左边开始:左下——>右下——>正上(左下和右下在同一层),遍历结果仍使用中序遍历的图
2.遍历结果:BAEFD CHZM G
说白了,前、中、后遍历是因为二叉树的根节点在整个遍历结果中处于前、中、后的位置,且在对子树进行遍历的时候,也要考虑子树根节点的遍历顺序
四、代码实现
下面用代码实现前、中、后三种遍历
思路:1.创建节点类,用于保存数据,并在其中写遍历方法,在里面用递归
2.创建二叉树类,再写遍历方法
public class BinaryTreeErgodic{
public static void main(String[] agrs){
BinaryTree bt = new BinaryTree();//先创建二叉树,然后给他加节点
TreeNode root = new TreeNode(1,"A");
TreeNode node2 = new TreeNode(2,"B");
TreeNode node3 = new TreeNode(3,"C");
TreeNode node4 = new TreeNode(4,"D");
TreeNode node5 = new TreeNode(5,"E"