介绍
二叉树的遍历,把 树上所有节点都访问一遍。因为树不是线性的(不像数组、链表可以从头读到尾),所以必须规定 访问顺序
分类
根据访问顺序分为广度优先遍历、深度优先遍历
广度优先遍历(BFS)
广度优先遍历,breadth-first search, BFS,也叫 层序遍历、层次遍历,核心是按 从上到下、从左到右 的顺序逐层访问节点
深度优先遍历 (DFS)
深度度优先,Depth - First Search,DFS,先往深走,遇到叶子节点再往回走
根据 访问根节点 的时机不同,又分为:
- 前序遍历:先访问
根,然后访问左节点(如果左节点下还有左节点,),最后访问右子树 - 中序遍历:先访问
左子树,然后访问根,最后访问右子树 - 后序遍历:先访问
左子树,然后访问右子树,最后访问根
理解记忆:
- 先序:根先访问,即:【根-左-右】
- 中序:根中间访问,即:【左-根-右】
- 后序:根最后访问,即:【左-右-根】
例子1
二叉树如下图:
层次遍历(从上至下,从左至右)
从上至下,从左至右,上图遍历结果为:
1、2、3、4、5、6、7、8
前序遍历【根-左-右】
先处理根结点,然后处理左子树,最后处理右子树,上图遍历过程:
- 先访问根,所以第一个是根节点
1 - 访问
1的左节点2。节点2也是有子结点,继续往下 - 访问
2的左节点4 - 访问
2的右节点5。节点5也是有子结点,继续往下 - 访问
5的左节点7。节点7也是有子结点,继续往下 - 访问
7的左节点,无 - 访问
7的右节点8。此时 根1的左侧子树都完毕 - 访问
1的右节点3。节点3也是有子结点,继续往下 - 访问
3的左节点,无 - 访问
3的右节点6
结果为:
1、2、4、5、7、8、3、6
中序遍历【左-根-右】——容易错
先处理左子树,然后处理根结点,最后处理右子树,上图遍历过程:
- 看根
1的左节点2,由于 节点2也是有子结点,所以不取值2,继续往下看 - 看节点
2的左节点4,节点4没有子结点,取该值4 - 遍历顺序是
左→根→右,取节点4的父节点2 - 看节点
2的右节点5,节点5也是有子结点,所以不取值5,继续往下 - 看节点
5的左节点7,由于 节点7也是有子结点,所以不取值7,继续往下看 - 看节点
7的左节点无/空,所以取节点7 - 看节点
7的右节点8,节点8是叶子节点,取值8 - 取节点
7的父节点5。此时 根节点1的左侧遍历结束 - 取根节点
1 - 看根节点
1的右节点3,节点3也是有子结点,所以不取值3,继续往下 - 看节点
3的左节点无/空,所以取节点3 - 看节点
3的右节点6,节点6是叶子节点,取值6
结果为:
4、2、7、8、5、1、3、6
提示:中间是根节点
后序遍历【左-右-根】——容易错
先处理左子树,然后处理右子树根结点,最后处理,上图遍历过程:
- 看根
1的左节点2,由于 节点2也是有子结点,所以不取值2,继续往下看 - 看节点
2的左节点4,节点4是叶子节点,取该值4 - 遍历顺序是
左→右→根,看节点4的父节点2的右节点5,节点5也是有子结点,所以不取值5,继续往下 - 看节点
5的左节点7,由于 节点7也是有子结点,所以不取值7,继续往下看 - 看节点
7的左节点无/空,不取值 - 看节点
7的右节点8,节点8是叶子节点,取值8 - 节点
7的左右子节点遍历完,取值7 - 看节点
7的父节点5的右节点无/空,不取值 - 节点
5的左右子节点遍历完,取值5 - 节点
2的左右子节点遍历完,取值2。此时根节点1的左子树遍历完毕 - 看根节点
1的右节点3,节点3也是有子结点,所以不取值3,继续往下看 - 看节点
3的左节点无/空,不取值 - 看节点
3的右节点6,节点6是叶子节点,取值6 - 节点
3的左右子节点遍历完,取值3。此时根节点1的右子树遍历完毕 - 取根节点
1
结果为:
4、8、7、5、2、6、3、1
提示:最后一个是根节点
例子2

前序遍历:1 2 4 5 7 8 3 6
中序遍历:4 2 7 5 8 1 3 6
后序遍历:4 7 8 5 2 6 3 1
层次遍历:1 2 3 4 5 6 7 8
题
由前序序列为 ABHFDECG;中序序列为 HBEDFAGC 构造二叉树。
分析
技巧:
前序确定根结点,根结点:A
中序区分左右子树,左子树:HBEDF,右子树:GC
答案
题
某二叉树的中序、先序遍历序列分别为 {20,30,10,50,40} ,{10,20,30,40,50},则该二叉树的后序遍历序列为()。
A、50, 40, 30, 20, 10
B、30,20,10, 50, 40
C、30, 20, 50, 40, 10
D、20,30,10,40,50
分析
通过先序遍历可知,根节点是 10,后续遍历序列最后一个元素是根节点 10,可排除 B、C
通过中序遍历可知:右子树的结点是 50、40,后续遍历序列倒数第二个元素是 50 或 40,可排除 A
答案
C


