一.简介
深度优先搜索算法(Depth-First-Search),是搜索算法的一种。是沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。属于盲目搜索。
深度优先搜索是图论中的经典算法,利用深度优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多相关的图论问题,如最大路径问题等等。
因发明“深度优先搜索算法”,霍普克洛夫特与陶尔扬共同获得计算机领域的最高奖:图灵奖.
——百度百科
二.实现思路
这是一个非常普通的节点结构图
这是深度优先算法的遍历方式:
1.红色代表由父节点向子节点遍历
2.灰色代表子节点下无其子节点,向其父节点返回(回溯)
当一条路径遍历完成时,查看当前父节点还有没有其他未遍历的子节点路径 ——> 重复1-2步
既然提到了深度优先算法,那我们再说一下广度优先算法的遍历方式
这是广度优先算法的遍历方式:
遍历离当前节点(根节点)最近的节点
由一个点 向四周扩散 (类似于往水里扔石头时激起的波纹)
三.实现代码
public static void main(String[] args) {
// 节点不可重复
HashMap<String,String[]> map = new HashMap<>();
String[] arr = {"jack","rows","bob"};
map.put("self",arr);
String[] arr2 = {"Awdrey","Awdry","Ayckbourn"};
map.put("jack",arr2);
String[] arr3 = {"Aylen","Aylward","Groves"};
map.put("rows",arr3);
String[] arr4 = {"das","dafa"};
map.put("Aylen",arr4);
String[] arr5 = {"oppo","si","daop"};
map.put("dafa",arr5);
String[] arr6 = {"aes","see","look"};
map.put("Awdrey",arr6);
// 记录板中必须包含根节点
hasNode.add("self");
Boolean aBoolean = searchDFS(map,"self");
System.out.println(aBoolean);
System.out.println("-------->>>"+Arrays.toString(hasNode.toArray()));
}
// 标记已经遍历过了的节点 -->>> 记录板
private static List<String> hasNode = new ArrayList<>();
public static Boolean searchDFS(HashMap<String,String[]> map,String key){
if (map.isEmpty()) {
return false;
}
// 获取当前节点所有子节点
String[] nodes = map.get(key);
if (nodes != null){
for (String node : nodes) {
// 过滤记录板中没有被标记的节点
if (hasNode.contains(node)){
continue;
}
// 标记当前节点
hasNode.add(node);
System.out.println(node);
// 找到想要的节点 -->>> 保证该节点必须存在 且不能为根节点
if (node.equals("bob")){
return true;
}
// 条件不满足 则再遍历当前节点的子节点
return searchDFS(map,node);
}
}
// 如果当前节点没有子节点 则找父节点
return searchDFS(map,hasNode.get(hasNode.indexOf(key)-1));
}
{\__/} {\__/}
( ·-·) (·-· )
/ >------------------------------------------------< \
| ☆ |
| ☆ |
| ★ |
| ☆ |
| ☆ |
| |
-------------------------------------