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

48 篇文章 0 订阅
46 篇文章 0 订阅

,和二叉树类似,只不过二叉树严格一个入点,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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值