二叉树广度优先搜索(BFS)
二叉树广度优先搜索意味着对节点的遍历是一层一层的,一层访问完才访问下一层。那么就是说从上往下访问时,父节点总是比子节点先访问。于是可以采用队列,队列的特征就是先进先出,于是可以按父子关系依次入队出队。
想象一下:对于一颗二叉树:
a
b c
d e f
按父节点先入队,子节点后入队时有:
-
a入队,队列:a
-
检测a的左右孩子,让其入队,同时由于a被访问,a出队,队列:b c
-
同上,访问b,同时让b的孩子入队,队列:c d e
-
访问c,让c的孩子入队,队列:d e f
-
def都没有孩子,依次访问,队列为空
此时来看看访问顺序:a b c d e f,可以看到访问顺序时正确的
代码:
/*
内部节点类
class Node{
int val;
Node left;
Node right;
}
*/
public void dfs(Node root) {
//队列用来保存节点
//由于父节点先入队,所以先访问父节点,
//等父节点访问完了才开始访问子节点,此时子节点变为父节点
if (root == null) {
System.out.println("null");
} else {
Queue<Node> nodeQueue = new LinkedList<>();
//将根节点入队
nodeQueue.add(root);
while (!nodeQueue.isEmpty()) {
//父节点出队
Node current = nodeQueue.remove();
System.out.println(current.val);
if (current.left != null) {
//左孩子入队
nodeQueue.add(current.left);
}
if (current.right != null) {
//右孩子入队
nodeQueue.add(current.right);
}
}
}
}