重点把握:我们首先将每一层的节点优先遍历完毕。
之前的遍历叫做深度优先遍历,我们尝试先走到最深。这一节我们学习广度优先遍历。
要想完成广度优先遍历,我们要借助队列(先进先出,后进后出)的概念。
思想 :当队列中的队首出队的时候,要从二叉搜索树中找到它的两个孩子入队。队列出队为空的时候,就将二叉树遍历完成了。
我们再归纳一下广度优先遍历的步骤:
1、将根节点入队(入队的时候不做别的操作);
2、队列非空,所以接下来就要出队,规则是:依次出队,只要出队的元素有孩子,左右孩子依次入队,如果没有孩子不做任何操作。
代码实现:
/**
* 层序遍历
*/
public void levelOrder() {
Queue<Node> queue = new ArrayDeque<>();
while (!queue.isEmpty()) {
Node node = queue.poll();
System.out.println(node.key);
if (node.left != null) {
queue.add(node.left);
}
if (node.right != null) {
queue.add(node.right);
}
}
}
以下的总结是针对深度优先遍历的 3 种方式和广度优先的1种方式,总共 4 种遍历方式而言的:整个遍历的复杂度是:O(n)。
每一个节点只访问了常数次。归并排序和快速排序的本质其实是二叉搜索树的深度优先遍历的过程。
重点把握思想:1、递归调用;2、使用队列实现一个更加复杂的算法的过程。