树的遍历也被称之为树的搜索。分为深度优先搜索和广度优先搜索。
深度优先搜索
深度优先搜索是指尽可能远地遍历每一条分支直到分支结束,再通过回溯遍历另一条分支。按照访问节点及其左右子树的顺序可以将其实现细分为三种:先序遍历、中序遍历、后续遍历。
先序遍历
- 打印当前节点
- 使用先序遍历遍历及打印左子树
- 使用先序遍历遍历及打印右子树
递归实现
1 | preorder(node) |
非递归实现
1 | preorder(node) |
中序遍历
- 使用中序遍历遍历及打印左子树
- 打印当前节点
- 使用中序遍历遍历及打印右子树
递归实现
1 | inorder(node) |
非递归实现
1 | inorder(node) |
后序遍历
- 使用后序遍历遍历及打印左子树
- 使用后序遍历遍历及打印右子树
- 打印当前节点
递归实现
1 | postorder(node) |
非递归实现
1 | postorder(node) |
广度优先搜索
广度优先搜索是自根节点起依次遍历每层的节点的方法。伪代码如下:1
2
3
4
5
6
7
8
9
10
11
12
13bfs(node)
if (node = null)
return
q ← empty queue
q.enqueue(node)
while (!node.isEmpty())
n ← q.dequeue()
visit(n)
if (n.left != null)
q.enqueue(n.left)
if (n.right != null)
q.enqueue(n.right)