目录
提要:
二叉树的遍历是指按某条搜索路径访问树中的每个结点,使得每个结点均被访问一次,而且仅能访问一次(说明不可二次访问,一遍而过)。遍历一颗二叉树便要决定对根结点N、左子树L和右子树的访问顺序。 二叉树常的的遍历方法有前序遍历(NLR)、中序遍历(LNR)和后序遍历(LRN)三种遍历算法,其中 “序” 指的是根结点在何时被访问。
遍历大致过程:
前序遍历:根结点 ---> 左子树 ---> 右子树
中序遍历:左子树---> 根结点 ---> 右子树
后序遍历:左子树 ---> 右子树 ---> 根结点
--------------------------------------------------------------------------------------------------------------------------------
创建一个简单的二叉树:
二叉树的存储结构分为:顺序存储和类似于链表的链式存储,这里我们学习链式存储的方式, 简单枚举一棵二叉树。
用孩子表示法创建一颗二叉树:
//孩子表示法
class KunBinaryTree{
//数据域
public int no;//序号
public String name;//姓名
public KunBinaryTree left;//左孩子的引用,常常代表左孩子为根的整棵左子树
public KunBinaryTree right;//右孩子的引用,常常代表右孩子为根的整棵右子树
//构造方法
public KunBinaryTree(int no,String name){
super();
this.no = no;
this.name = name;
}
}
public class TestBinaryTree {
public static void main(String[] args){
//对象实例化
KunBinaryTree root = new KunBinaryTree(1,"唱");
KunBinaryTree node1 = new KunBinaryTree(2,"跳");
KunBinaryTree node2 = new KunBinaryTree(3,"rap");
KunBinaryTree node3 = new KunBinaryTree(4,"篮球");
KunBinaryTree node4 = new KunBinaryTree(5,"music");
KunBinaryTree node5 = new KunBinaryTree(6,"坤坤");
//链接各个节点,使其构成一颗二叉树
root.left = node1;
root.right = node2;
node2.left = node3;
node2.right = node4;
node4.left = node5;
}
}
创建了一颗如图所示的二叉树(一共有6个节点,其中root节点为 “唱”):
--------------------------------------------------------------------------------------------------------------------------------
二叉树的前中后序遍历:
通过上面的简单介绍,我们可以开始正式学习接下来的操作了
二叉树的前序遍历:
基本思路:
若二叉树为空,什么都不做,否则:
i、先访问根结点;
ii、再前序遍历左子树;
iii、最后前序遍历右子树;
代码实现:
//前序遍历
public static void preOrder(KunBinaryTree root){
if(root == null){
return ;
}
System.out.print(root.no+" "+root.name+" ");//先访问根
preOrder(root.left);//接着左右子树
preOrder(root.right);
}
函数递归展开图解:
首先,我们从蓝色出发,也就是途中的①,按照先根节点后左右子树的过程进行依次遍历,这里相当于先打印根节点所对应的数据域中的信息后,在接着递归调用左子树,直到为空,回溯后递归调用右子树,直到为空。该树的左子树(总的)调用完后, 开始调用右子树,来到②过程,按照(根-----》左子树---》右子树)的规则继续递归。直到左右子树都为空,返回,也就是③,④过程。从途中可以看出,打印的顺序为:1 唱 2 跳 3 rap 4 篮球 5 music 6 坤坤
通过遍历的测试结果也显示,上述过程正确:
或则用更明了直观的动图解释(图中栗子不为上述栗子,仅做参考,便于理解):
二叉树的中序遍历:
基本思路:
二叉树为空,什么也不做,否则:
i、中序遍历左子树;
ii、访问根结点;
iii、中序遍历右子树
代码实现:
//中序遍历
public static void infixOrder(KunBinaryTree root){