二叉树的遍历
先中后序遍历
先中后的含义
- 先中后代表了根节点的访问次序
- 一定会先遍历左结点再遍历右结点
假设对于一个结点(N) 他的左结点(L) 他的右节点(R)按照先中后序进行遍历的遍历顺序如下
遍历方法 | 遍历结果 |
---|---|
先序遍历 | NLR |
中序遍历 | LNR |
后续遍历 | LRN |
遍历时的注意点
对于某个结点来说一定要将此结点按照指定的遍历顺序遍历完全
- 例如如果按照中序遍历准备开始遍历某个结点时,就要依照遍历顺序先遍历左结点
- 并且在遍历左结点时,也要按照遍历顺序进行遍历,对当前左结点的左结点进行中序遍历
- 只有当某个结点的左节点为空时,才能按照指定的遍历顺序选择当前遍历中的下一个应该遍历的结点 在当前例子中应该选择根节点进行遍历
- 在当前遍历的所有左中右结点都遍历过一遍后才向上继续遍历
- 在执行时应该具有递归思维
遍历的例子
按照先序遍历(中左右)
- 从结点1开始先遍历到结点1 输出1
- 接着开始遍历结点2
- 对于以结点2为根节点的遍历先遍历到结点2 输出2
- 接着开始遍历结点4
- 对于以结点4为根节点的遍历先遍历到结点4 输出4
- 由于结点4没有左右结点 所以紧接着的遍历都为空
- 由于左中右结点都被遍历完全 因此现在回到以结点2作为根节点的遍历当中
- 由于已经按照顺序 中左右遍历了结点2和结点4 所以现在开始遍历结点5
- 对于以结点5为根节点的遍历先遍历到结点5 输出5
- 由于结点5没有左右结点 所以紧接着的遍历都为空
- 由于左中右结点都被遍历完全 因此现在回到以结点2作为根节点的遍历当中
- 由于结点2作为根节点的遍历 已经将左中右结点都遍历完全 因此现在回到以结点1作为根节点的遍历当中
- 由于已经按照顺序 中左右遍历了结点1和结点2 所以现在开始遍历结点3
- 对于以结点3为根节点的遍历先遍历到结点3 输出3
- 接着按照顺序接着遍历左结点6
- 对于以结点6为根节点的遍历先遍历到结点6 输出6
- 由于结点6没有左右结点 所以紧接着的遍历都为空
- 由于左中右结点都被完全遍历 因此现在回到以结点3作为根节点的遍历当中
- 接着按照顺序遍历右节点 但由于结点3没有右结点
- 由于左中右结点都被完全遍历 因此现在回到以结点1作为根节点的遍历当中
- 由于左中右结点都被完全遍历 并且现在已经在结点1上 往上没有结点了 所以遍历结束
- 遍历序列为 1 2 4 5 3 6
代码语言实现先中后序遍历
先序遍历
1 | int PreOrderLoop(BinaryTree tree) { |
中序遍历
1 | int MidOrderLoop(BinaryTree tree) { |
后序遍历
1 | int LatOrderLoop(BinaryTree tree) { |
层序遍历
层序遍历的顺序
从第一层开始 从左往右 从上到下依次输出结点的数据
对于一个完全二叉树而言
输出的序列按照结点编号而言就是$1\sim n$ 依次输出
代码语言
结构体定义
1 | // 定义链式二叉树的结构体 |
进行层序遍历
1 | int loopWithNum(BinaryTree tree) { //标准命名为 LevelOrder |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 蒲公英!