搜索算法模板(Java)
搜索
DFS(深搜)
一条道走到黑,不管中途遇到什么岔路口都不停,直到这条道没后面的路了,再回到前一个岔路口,继续一条道走到黑。不断回溯,直到全部节点都被搜完
优缺点
public static void DFS(int v){//图的深搜 visited[v]=true; for (int i = 0; i < a[0].length; i++) { if (check()&&visited[i]==false){ DFS(i);//回溯 } } } public static void DFS(TreeNode head){//树的深搜使用回溯 if (head==null)return; check();//满足条件的check(); if (head.left!=null){ DFS(head.left); }if (head.right!=null){ DFS(head.right); } }
BFS(宽搜)
即由一点逐级往下搜索,以图为例,由顶点v1可以延伸到v2、v3,再由v2可以延伸到v1、v4、v5,被搜索过的顶点不用再次搜索,直到整个图的节点被搜完一遍。
优缺点
•空间复杂度是呈现出指数增长。
•不存在爆栈的危险。
•可以搜索最短路径、最小等问题
public static void BFS(int v){//图的宽搜 Queue<Integer> queue=new LinkedList<>(); Boolean[] visited=new Boolean[a.length*a[0].length];//已被访问节点 visited[v]=true; queue.add(v); int []prev=new int[a.length*a[0].length]; int l=0; prev[l]=0; while (queue.size()!=0){ int v2=queue.poll(); for (int i = 0; i <a[0].length ; i++) {//从v2点开始往下搜 if (visited[i]==false&&check()){//结点满足条件的check(); queue.add(i); prev[++l]=i; } visited[i]=true; } } } public static void BFS(TreeNode head){//树的宽搜 if (head==null)return; Queue<TreeNode> queue=new LinkedList<>(); queue.offer(head); while (!queue.isEmpty()){ TreeNode m=queue.poll(); //System.out.print(m.val+" "); //dosomething(); if (m.left!=null){ queue.offer(m.left); }if (m.right!=null){ queue.offer(m.right); } } }