Performing Breadth First Search recursively

后端 未结 21 2345
不思量自难忘°
不思量自难忘° 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 02:05

    If you use an array to back the binary tree, you can determine the next node algebraically. if i is a node, then its children can be found at 2i + 1 (for the left node) and 2i + 2 (for the right node). A node's next neighbor is given by i + 1, unless i is a power of 2

    Here's pseudocode for a very naive implementation of breadth first search on an array backed binary search tree. This assumes a fixed size array and therefore a fixed depth tree. It will look at parentless nodes, and could create an unmanageably large stack.

    bintree-bfs(bintree, elt, i)
        if (i == LENGTH)
            return false
    
        else if (bintree[i] == elt)
            return true
    
        else 
            return bintree-bfs(bintree, elt, i+1)        
    
    0 讨论(0)
  • 2020-11-28 02:05

    I couldn't find a way to do it completely recursive (without any auxiliary data-structure). But if the queue Q is passed by reference, then you can have the following silly tail recursive function:

    BFS(Q)
    {
      if (|Q| > 0)
         v <- Dequeue(Q)
         Traverse(v)
         foreach w in children(v)
            Enqueue(Q, w)    
    
         BFS(Q)
    }
    
    0 讨论(0)
  • 2020-11-28 02:05

    Here is a BFS recursive traversal Python implementation, working for a graph with no cycle.

    def bfs_recursive(level):
        '''
         @params level: List<Node> containing the node for a specific level.
        '''
        next_level = []
        for node in level:
            print(node.value)
            for child_node in node.adjency_list:
                next_level.append(child_node)
        if len(next_level) != 0:
            bfs_recursive(next_level)
    
    
    class Node:
        def __init__(self, value):
            self.value = value
            self.adjency_list = []
    
    0 讨论(0)
提交回复
热议问题