概述
在Leetcode中最基础的二叉树遍历问题有:144.二叉树的前序遍历,94.二叉树的中序遍历,145.二叉树的后序遍历以及102.二叉树的层序遍历。
首先简单介绍一下各种不同的遍历方式:
- 前序遍历:根节点->左分支->右分支
2. 中序遍历:左分支->根节点->右分支
3. 后序遍历:左分支->右分支->根节点
4. 层序遍历:逐层遍历,当一层全部节点搜索完后再进入下一层
前中后序遍历属于深度优先搜索(DFS)问题,而层序遍历属于宽度优先搜索(BFS)问题。下面介绍各种解法:
1.递归法
#前序遍历
2.迭代法(利用栈或队列)
#前序遍历
3.双色标记法
主要思路:
- 同样是利用栈的一种迭代方法。
- 用灰白两种颜色表示节点的访问状态,白色为未访问,灰色为已访问。
- 当前节点为白色时:将其标记为灰色,按照目标顺序将自身以及左右节点入栈。
- 当前节点为灰色时:保存当前节点值
#前序遍历
4.莫里斯(Morris)遍历法
算法流程:
- 前序遍历
- 初始化当前节点cur为root
- while cur不为空时:
- 将cur添加到res
- 判断cur左右分支存在状况:当右分支不存在时:
- 进入左分支,cur = cur.left
- 当左分支不存在时:
- 进入右分支,cur = cur.right
- 当左右分支都存在时:
- 将右支树(cur.right)连接到左支树中前序优先级最后的节点的左子节点位置上
- 进入左分支,cur = cur.left
- 中序遍历
- 初始化当前节点cur为root
- while cur不为空时:
- 判断cur是否有左分支,如果没有:
- 将cur添加到res
- 进入右分支,cur = cur.right
- 如果有:
- 将cur除了左支树以外的部分连接到左支树中最右节点的右子节点位置上
- 进入左分支,cur = cur.left
- 判断cur是否有左分支,如果没有:
- 后序遍历
#前序遍历
图片来自 :
https://towardsdatascience.com/4-types-of-tree-traversal-algorithms-d56328450846