一、DFS 深度优先搜索(Depth-First-Search)
1. 概述 DFS它沿着树的深度遍历树的节点,尽可能深的搜索树的分支. 当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点 这一过程一直进行到已发现从源节点可达的所有节点为止. 如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止. 一般用堆数据结构来辅助实现DFS算法.
2. 深度优先遍历算法步骤 (1) 访问顶点v; (2) 依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问 (3) 若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止
3. 代码实现
/**
* 13
* / \
* 65 5
* / \ \
* 97 25 37
* / /\ /
* 22 4 28 32
*/
/**
* 深度优先遍历,相当于先根遍历
* 采用非递归实现
* 需要辅助数据结构:栈
*/
public void depthOrderTraversal() {
if (root == null) {
System.out.println("empty tree");
return;
}
ArrayDeque<TreeNode> stack = new ArrayDeque<TreeNode>();
stack.push(root);
while (stack.isEmpty() == false) {
TreeNode node = stack.pop();
System.out.print(node.value + " ");
if (node.right != null) {
stack.push(node.right);
}
if (node.left != null) {
stack.push(node.left);
}
}
System.out.print("\n");
}
二、BFS 广度优先搜索(Breadth-First-Search)
1. 概述 BFS是从根节点开始,沿着树(图)的宽度遍历树(图)的节点. 如果所有节点均被访问,则算法中止。 一般用队列数据结构来辅助实现BFS算法。
2. 广度优先遍历算法步骤 (1) 首先将根节点放入队列中 (2) 从队列中取出第一个节点,并检验它是否为目标。如果找到目标,则结束搜寻并回传结果。否则将它所有尚未检验过的直接子节点加入队列中。 (3) 若队列为空,表示整张图都检查过了,即图中没有欲搜寻的目标。结束搜寻并回传“找不到目标”。 (4) 重复步骤2。
3. 代码实现
/**
* 广度优先遍历
* 采用非递归实现
* 需要辅助数据结构:队列
*/
public void levelOrderTraversal() {
if (root == null) {
System.out.println("empty tree");
return;
}
ArrayDeque<TreeNode> queue = new ArrayDeque<TreeNode>();
queue.add(root);
while (queue.isEmpty() == false) {
TreeNode node = queue.remove();
System.out.print(node.value + " ");
if (node.left != null) {
queue.add(node.left);
}
if (node.right != null) {
queue.add(node.right);
}
}
System.out.print("\n");
}