深度优先和广度优先查找以及拓扑排序

2019-06-27  本文已影响0人  ZuYuan

深度和广度优先查找

    static class Node {
        int value;
        Node[] next;
        boolean marked = false;
    }

    /**
     * 深度优先遍历
     */
    public static void dfs(Node[] nodes) {
        for (Node node : nodes) {
            if (!node.marked) dfs(node);
        }
    }

    static Stack<Node> stack = new Stack<>();
    private static void dfs(Node node) {
        stack.push(node);
        node.marked = true;
        System.out.println("访问结点,值=" + node.value);
        for (Node nextN : node.next) {
            if (!nextN.marked) {
                dfs(nextN);
                break;
            }
        }
        while (stack.isEmpty()) {
            stack.pop();
            //回退到前一个,判断是否还有结点未访问
            Node n = stack.pop();
            stack.push(n);
            for (Node nextN : n.next) {
                if (!nextN.marked) {
                    dfs(nextN);
                    break;
                }
            }
        }
    }

//    /**
//     * 不使用栈的DFS
//     */
//    private static void dfs(Node node) {
//        System.out.println("访问结点,值=" + node);
//        node.marked = true;
//        for (Node nextNode : node.next) {
//            if (!nextNode.marked) {
//                dfs(nextNode);
//            }
//        }
//    }

    


    /**
     * 广度优先遍历
     */
    public static void bfs(Node[] nodes) {
        for (Node node : nodes) {
            if (!node.marked) bfs(node);
        }
    }

    private static void bfs(Node node) {
        Queue<Node> queue = new ArrayDeque<>();
        queue.add(node);
        while (!queue.isEmpty()) {
            Node headNode = queue.poll();
            headNode = true;
            System.out.println("访问结点,值=" + headNode.value);
            for (Node oneNode : headNode.next) {
                if (!oneNode.marked) queue.add(oneNode);
            }
        }
    }

拓扑排序

排序V5-V1-V4-V3-V7-V6
上一篇 下一篇

猜你喜欢

热点阅读