Performing Breadth First Search recursively

后端 未结 21 2513
不思量自难忘°
不思量自难忘° 2020-11-28 01:12

Let\'s say you wanted to implement a breadth-first search of a binary tree recursively. How would you go about it?

Is it possible using only the call-stack

21条回答
  •  [愿得一人]
    2020-11-28 01:59

    BFS for a binary (or n-ary) tree can be done recursively without queues as follows (here in Java):

    public class BreathFirst {
    
        static class Node {
            Node(int value) {
                this(value, 0);
            }
            Node(int value, int nChildren) {
                this.value = value;
                this.children = new Node[nChildren];
            }
            int value;
            Node[] children;
        }
    
        static void breathFirst(Node root, Consumer printer) {
            boolean keepGoing = true;
            for (int level = 0; keepGoing; level++) {
                keepGoing = breathFirst(root, printer, level);
            }
        }
    
        static boolean breathFirst(Node node, Consumer printer, int depth) {
            if (depth < 0 || node == null) return false;
            if (depth == 0) {
                printer.accept(node);
                return true;
            }
            boolean any = false;
            for (final Node child : node.children) {
                any |= breathFirst(child, printer, depth - 1);
            }
            return any;
        }
    }
    

    An example traversal printing numbers 1-12 in ascending order:

    public static void main(String... args) {
        //            1
        //          / | \
        //        2   3   4
        //      / |       | \
        //    5   6       7  8
        //  / |           | \
        // 9  10         11  12
    
        Node root = new Node(1, 3);
        root.children[0] = new Node(2, 2);
        root.children[1] = new Node(3);
        root.children[2] = new Node(4, 2);
        root.children[0].children[0] = new Node(5, 2);
        root.children[0].children[1] = new Node(6);
        root.children[2].children[0] = new Node(7, 2);
        root.children[2].children[1] = new Node(8);
        root.children[0].children[0].children[0] = new Node(9);
        root.children[0].children[0].children[1] = new Node(10);
        root.children[2].children[0].children[0] = new Node(11);
        root.children[2].children[0].children[1] = new Node(12);
    
        breathFirst(root, n -> System.out.println(n.value));
    }
    

提交回复
热议问题