图的宽度优先遍历以及深度优先比遍历

news/2024/7/20 20:39:24 标签: 宽度优先, 深度优先, 算法

,和二叉树类似,只不过二叉树严格一个入点,2个出点。而图则不限制
在这里插入图片描述

宽度优先遍历

1.利用队列来实现
2.将源节点依次按照宽度进队列,然后弹出
3.每弹出一个结点,就该节点的多有邻接节点放进队列
4.不断

private void bfs(Node node){
	if (null == node){
        return;
    }
    LinkedList<Node> queue = new LinkedList<>();
    HashSet<Node> set = new HashSet<>();
    queue.add(node);
    set.add(node);
    while (!queue.isEmpty()){
        Node poll = queue.poll();
        System.out.println(poll.value);
        //将节点邻近的没有遍历过的节点全部入队列
        for (Node next : poll.nexts) {
            if (!set.contains(next)){
                queue.add(next);
                set.add(next);
            }
        }
    }
	
}

深度遍历

利用栈实现,将源节点按照深度入栈,然后弹出,每弹出一个结点,把该节点的下一个没有入过栈的邻节点放入栈,直到栈变空

private void dfs(Node node){
	Stack<Node> stack = new Stack<>();
    HashSet<Node> set = new HashSet<>();
    stack.push(node);
    set.add(node);
    System.out.println(node.value);
    while (!stack.isEmpty()){
        Node pop = stack.pop();
        for (Node next : pop.nexts) {
            if (!set.contains(next)){
                stack.push(pop);
                stack.push(next);
                set.add(next);
                System.out.println(next.value);
                break;
            }
        }
    }
}

测试代码

public class Node {
    public int value;
    public int in;
    public int out;
    public ArrayList<Node> nexts;
    public ArrayList<Edge> edges;

    public Node(int value) {
        this.value = value;
        in = 0;
        out = 0;
        nexts = new ArrayList<>();
        edges = new ArrayList<>();
    }
}

public class BFS {

    private static void bfs(Node node){
        if (null == node){
            return;
        }
        LinkedList<Node> queue = new LinkedList<>();
        HashSet<Node> set = new HashSet<>();
        queue.add(node);
        set.add(node);
        while (!queue.isEmpty()){
            Node poll = queue.poll();
            System.out.println(poll.value);
            //将节点邻近的没有遍历过的节点全部入队列
            for (Node next : poll.nexts) {
                if (!set.contains(next)){
                    queue.add(next);
                    set.add(next);
                }
            }
        }
    }

    public static void main(String[] args) {
        Node node1 = new Node(1);
        Node node2 = new Node(2);
        Node node3 = new Node(3);
        Node node4 = new Node(4);
        Node node5 = new Node(5);
        Node node6 = new Node(6);

        ArrayList<Node> list1 = new ArrayList<>();
        list1.add(node2);
        list1.add(node4);
        list1.add(node6);
        node1.nexts = list1;

        ArrayList<Node> list2 = new ArrayList<>();
        list2.add(node1);
        list2.add(node3);
        list2.add(node4);
        list2.add(node5);
        node2.nexts = list2;

        ArrayList<Node> list3 = new ArrayList<>();
        list3.add(node2);
        list3.add(node4);
        node3.nexts = list3;

        ArrayList<Node> list4 = new ArrayList<>();
        list4.add(node1);
        list4.add(node2);
        list4.add(node3);
        node4.nexts = list4;

        ArrayList<Node> list5 = new ArrayList<>();
        list5.add(node2);
        list5.add(node6);
        node5.nexts = list5;

        ArrayList<Node> list6 = new ArrayList<>();
        list6.add(node1);
        list6.add(node5);
        node6.nexts = list6;

        bfs(node1);

    }

}
public class DFS {

    private static void dfs(Node node){
        Stack<Node> stack = new Stack<>();
        HashSet<Node> set = new HashSet<>();
        stack.push(node);
        set.add(node);
        System.out.println(node.value);
        while (!stack.isEmpty()){
            Node pop = stack.pop();
            for (Node next : pop.nexts) {
                if (!set.contains(next)){
                    stack.push(pop);
                    stack.push(next);
                    set.add(next);
                    System.out.println(next.value);
                    break;
                }
            }
        }

    }

    public static void main(String[] args) {
        Node node1 = new Node(1);
        Node node2 = new Node(2);
        Node node3 = new Node(3);
        Node node4 = new Node(4);
        Node node5 = new Node(5);
        Node node6 = new Node(6);

        ArrayList<Node> list1 = new ArrayList<>();
        list1.add(node2);
        list1.add(node4);
        list1.add(node6);
        node1.nexts = list1;

        ArrayList<Node> list2 = new ArrayList<>();
        list2.add(node1);
        list2.add(node3);
        list2.add(node4);
        list2.add(node5);
        node2.nexts = list2;

        ArrayList<Node> list3 = new ArrayList<>();
        list3.add(node2);
        list3.add(node4);
        node3.nexts = list3;

        ArrayList<Node> list4 = new ArrayList<>();
        list4.add(node1);
        list4.add(node2);
        list4.add(node3);
        node4.nexts = list4;

        ArrayList<Node> list5 = new ArrayList<>();
        list5.add(node2);
        list5.add(node6);
        node5.nexts = list5;

        ArrayList<Node> list6 = new ArrayList<>();
        list6.add(node1);
        list6.add(node5);
        node6.nexts = list6;

        dfs(node1);
    }
}

http://www.niftyadmin.cn/n/875869.html

相关文章

大气压力换算公式_气压单位换算表(压力单位换算公式大全)

1bar105Pa&#xff0c;一个标准大气压1.01325*105Pa;1bar0.98665标准大气压1巴(bar)100,000帕(Pa)10牛顿/平方厘米0.1MPa 是压强的单位&#xff0c;早先气象学中常用毫巴.咱们这教材&#xff0c;气压单位一会是hPa&#xff0c;一会是mb&#xff0c;也不说声是什么意思&#xff…

创建图java

生成图,可以将一些现有的数据转换成自己熟悉的方式&#xff0c;比如说下面的例子&#xff0c;将二维数组转变成了自己熟悉的图 public class CreateGraph{//matrix[i][0] weight//matrix[i][1] from//matrix[i][2] topublic static Graph createGraph(Integer[][] matri…

win10右键卡顿原因_Win10 右键卡顿解决办法

Win10上鼠标右键单击卡顿&#xff0c;原因在于右键菜单内容太多了&#xff0c;需要清理某些项目&#xff0c;解决方法如下&#xff1a;1.winr 输入 regedit&#xff0c;打开注册表编辑器2.定位到&#xff1a;HKEY_CLASSES_ROOT/Directory/Background/shellex/ContextMenuHandle…

mysql5.7.6允许远程_mysql5.7 设置远程访问

mysql5.7设置远程访问不是和网上说的一样建个用户赋个权限就可以访问的。比如下边这个就是建用户赋权限&#xff0c;可能在之前的版本可以&#xff0c;但是我在我的mysql上一直不行。为此烦了好久&#xff01;&#xff01;&#xff01;项目都耽误了&#xff01;&#xff01;一、…

dijkstra算法以及优化

dijkstra算法 Dijkstra算法是一种最短路径路由算法&#xff0c;用于计算一个节点到其他所有节点的最短路径 无向图&#xff0c;但是必须给出初始节点 public class Dijkstra {private static HashMap<Node, Integer> dijkstral(Node head){HashMap<Node, Integer>…

window7安装mysql5.7.11_win7-x64安装mysql5.7.11(官方zip版)

1.下载官方安装包(http://www.mysql.com/downloads/)&#xff0c;此zip包是没有安装器的(*.msi)&#xff0c;也没有辅助配置的自动程序。2.解压zip包&#xff0c;将文件放入指定目录&#xff0c;如&#xff1a;D:\MySQL5.7.113.添加环境变量&#xff1a;MYSQL_HOMED:\MySQL5.7.…

前缀树java

一个字符串类型的数组arr1,另一个字符串类型的数组arr2&#xff0c;arr2中有哪些字符是arr1中出现的。arr2中有哪些字符是作为arr1中某个字符串前缀出现的&#xff0c;arr2中有哪些字符是作为arr1中某个字符串的前缀出现的&#xff0c;打印arr2中出现次数最大的前缀 public cla…

mysql 所有下级_使用mysql存储过程递归tree(如一个上级下面的所有下级的所有下级。。。。)...

创建存储过程DROP FUNCTION getSubAgent;CREATE FUNCTION getSubAgent (agentId INT)RETURNS VARCHAR(4000)BEGINDECLARE sTemp VARCHAR(4000);DECLARE sTempChd VARCHAR(4000);SET sTemp 0;SET sTempChd cast(agentId as char);WHILE sTempChd is not NULL DOSET sTemp CON…