前言
本文介绍二叉树的几种遍历方式:先序、中序、后序、递归序。
二叉树
二叉树(Binary Tree)是树形结构的一个非常重要的类型,他的每个节点最多有个两个分支,两个分支也被称为左子树、右子树。
二叉树拥有广泛的应用场景,是红黑树、二叉堆、多叉树、AVL树、有序表等大量数据结构的基础,所以说理解二叉树是非常有必要的。
如下图就是一个普通的二叉树。
用代码来定义一个二叉树:
public class Node {
public int value;
public Node left;
public Node right;
public Node(int v) {
value = v;
}
}
下面来介绍下二叉树的几种遍历方式:先序遍历、中序遍历、后序遍历。
先序遍历
先序遍历的顺序是:访问根节点(头)->遍历左子树(左)->遍历右子树(右),简称:头->左->右。
对于一棵二叉树来说,针对二叉树的每一个子树的顺都是:头->左->右。
例如上图中二叉树先序遍历的顺序为:1->2->4->5->3->6->7。
对于根节点1来说,先访问它自己,然后遍历1的左子树2、4、5,再遍历1的右子树3、6、7。
对于子节点2来说,先访问它自己,然后遍历2的左子树4,再遍历2的右子树5。
所以说是对任意节点来说都是头->左->右。
代码实现:
代码实现的思路是,拿到根节点后,先打印自己,然后递归遍历根节点的左节点,最后递归遍历根节点的右节点。
public void pre(Node head) {
if (head == null) {
return;
}
System.out.println(head.value);
pre(head.left);
pre(head.right);
}
中序遍历
中序遍历的顺序是:遍历左子树(左)->访问根节点(头)->遍历右子树(右),简称:左->头->右。
对于一棵二叉树来说,针对二叉树的每一个子树的顺都是:左->头->右。
例如上图中二叉树中序遍历的顺序为:4->2->5->1->6->3->7。
对于根节点1来说,先遍历1的左子树4、2、5,然后访问它自己1,再遍历1的右子树6、3、7。
对于子节点2来说,先遍历2的左子树4,然后访问2自己,再遍历2的右子树5。
所以说是对任意节点来说都是左->头->右。
代码实现:
代码实现的思路是,拿到根节点后,先递归遍历根节点的左节点,然后打印根节点,最后递归遍历根节点的右节点。
public void in(Node head) {
if (head == null) {
return;
}
in(head.left);
System.out.println(head.value);
in(head.right);
}
后序遍历
后序遍历的顺序是:遍历左子树(左)->遍历右树(右)->访问根节点(头),简称:左->右->头。
对于一棵二叉树来说,针对二叉树的每一个子树的顺都是:左->右->头。
例如上图中二叉树后序遍历的顺序为:4->5->2->6->7->3->1。
对于根节点1来说,先遍历1的左子树4、5、2,再遍历1的右子树6、7、3,然后访问它自己1。
对于子节点2来说,先遍历2的左子树4,再遍历2的右子树5,然后访问2自己。
所以说是对任意节点来说都是左->右->头。
代码实现:
代码实现的思路是,拿到根节点后,先递归遍历根节点的左节点,然后递归遍历根节点的右节点,最后打印根节点。
public void pos(Node head) {
if (head == null) {
return;
}
pos(head.left);
pos(head.right);
System.out.println(head.value);
}
递归序
从上面的分析以及代码来看,先序、中序、后序,只是打印这个操作放的位置不同,其他部分都是一样的,如果把打印操作去掉的话,那么这三个代码执行的结果是完全一样的,这就涉及到一个概念——递归序,也就是递归的顺序。
现在,我们把打印操作去掉,得到的函数为:
public void func(Node head) {
if (head == null) {
return;
}
func(head.left);
func(head.right);
}
我们针对上图,上这段代码来看下节点的访问顺序:
1->2->4->null->4->null->4->2->5->null->5->null->5->2->1->3->6->null->6->null->6->3->7->null->7->null->7->3->1。
下面,我们再来看下,什么叫先序遍历,先序遍历是第1次遇到这个数就输出它,得到的结果就是先序遍历结果,把上述访问链的第1次遇到的数输出如下:1->2->4->5->3->6->7,看一下是不是先序遍历的结果?答案是肯定的。
再看下中序遍历,中序遍历是第2次遇到这个数就输出,得到的结果就是中序遍历的结果。把上述访问链的第2次遇到的数输出如下:4->2->5->1->6->3->7。
同样的,后续遍历为在递归链中第3次遇到这个数就输出,把上述访问链的第3次遇到的数输出如下:4->5->2->6->7->3->1。
总结
本文介绍二叉树的几种遍历方式:先序、中序、后序、递归序,并用递归序证明了先、中、后序遍历的原理。
如果本文对你有帮助,就帮忙点个赞吧^_^