二叉树的遍历方式有很多种,这篇文章将会介绍二叉树的先序遍历(前序遍历)、中序遍历、后序遍历、层序遍历、深度优先遍历以及广度优先遍历。
以下遍历结果基于下图:
1. 先序遍历
先序遍历的思路是:根节点->左子树->右子树。比如图中二叉树的先序遍历结果应该是:FDBACEGHIJ。注意:对于任何一个节点,都必须先遍历自身,接着是其其左子树中的所有节点,再遍历右子树中的节点。
2. 中序遍历
中序遍历的思路是:左子树,根节点(自身),右子树。比如图中二叉树的中序遍历结果应该是:ABCDEFHGJI。注意:中序遍历和后序遍历都从最左侧的节点开始遍历,这时可以借助一个栈实现。
3. 后序遍历
后序遍历的思路是:左子树->右子树->根节点(自身)。比如图中的二叉树的后续遍历结果应该是:ACBEDHJIGF。注意:后序遍历的第一个节点也是最左侧的节点,但根节点应该是最后一个被遍历到的。
4. 层序遍历
层序遍历的思路是从树的根节点开始,从上到下,接着在每一层从左到右进行遍历。比如图中的二叉树的层序遍历结果应该是:FDGBEHIACJ。注意:二叉树的层序遍历一般会使用队列。
5. 深度优先遍历(DFS)
深度优先遍历的思路可以简单理解为从根节点开始走,每次遇到岔路就尝试走其中一条,直到无路可走则返回到上一个路口尝试另一条没有尝试的道路,直到上一个节点所有的道路都尝试完毕,再退回到上一个节点的上一个节点,循环往复。比如图中的二叉树的DFS遍历的其中一个结果应该是:FDBACEGHIJ。注意:深度优先搜索使用一般使用栈实现。
6. 广度优先遍历(BFS)
广度优先遍历的思路是从树的根节点开始,依次访问这个节点的所有道路,直到所有道路都被访问完毕以后再对刚才访问过的节点的其他道路进行依次访问。比如图中的二叉树的BFS遍历的其中一个结果应该是:FDGBEHIACJ。注意:广度优先搜索一般使用队列实现。
注意:深度优先搜索和广度优先搜索的结果都不是唯一的,其中的顺序取决于先遍历左子树还是右子树。