一.简介

  深度优先搜索算法(Depth-First-Search),是搜索算法的一种。是沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。属于盲目搜索

  深度优先搜索是图论中的经典算法,利用深度优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多相关的图论问题,如最大路径问题等等。

  因发明“深度优先搜索算法”,霍普克洛夫特与陶尔扬共同获得计算机领域的最高奖:图灵奖.

                                                                                                                                                                            ——百度百科

二.实现思路

                                  

深度优先搜索树java 深度优先搜索算法java_深度优先

   这是一个非常普通的节点结构图

                                   

深度优先搜索树java 深度优先搜索算法java_搜索算法_02

 这是深度优先算法的遍历方式:

                                1.红色代表由父节点向子节点遍历

                                2.灰色代表子节点下无其子节点,向其父节点返回(回溯)

                              当一条路径遍历完成时,查看当前父节点还有没有其他未遍历的子节点路径  ——> 重复1-2步  

 既然提到了深度优先算法,那我们再说一下广度优先算法的遍历方式

                               

深度优先搜索树java 深度优先搜索算法java_深度优先搜索树java_03

   这是广度优先算法的遍历方式:

                                   遍历离当前节点(根节点)最近的节点

                                   由一个点 向四周扩散 (类似于往水里扔石头时激起的波纹)

三.实现代码

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));
    }
{\__/}                                          {\__/}
                ( ·-·)                                          (·-· )
                / >------------------------------------------------< \
                         |      ☆                            |
                         |         ☆                         |
                         |  ★                                |
                         |         ☆                         |
                         |      ☆                            |
                         |                                   |
                         -------------------------------------