BFS in binary tree

前端 未结 3 1533
我在风中等你
我在风中等你 2021-02-10 10:38

I\'m trying to write the codes for breadth-first search in binary tree. I\'ve stored all the data in a queue, but I can\'t figure out how to travel to all nodes and consume all

3条回答
  •  没有蜡笔的小新
    2021-02-10 11:05

    void bfs_bintree (btree_t *head)
    {
      queue_t *q;
      btree_t *temp;
    
      q = queue_allocate ();
      queue_insert (q, head);
    
      while (!queue_is_empty (q))
      {
        temp = queue_remove (q);
    
        if (temp->left)
          queue_insert (temp->left);
    
        if (temp->right)
          queue_insert (temp->right);
      }
      queue_free (q);
      return;
    }
    

    First the head node is inserted into the queue. The loop will iterate while the queue is not empty. Starting from the head node, in each iteration one node is removed and the non-null childs are inserted in the queue. In each iteration one node gets out and its non-null childs gets pushed. In the next iteration the next oldest discovered vertex, which is now at the front of the queue , is taken out (in the order they were discovered) and then they are processed to check their child.

                                    A
                                   / \
                                  /   \
                                 B     C
                                / \     \
                               /   \     \
                              D     E     F
                             / \         / \
                            /   \       /   \
                           G     H     I     J
    
    
    iteration  Vertex Selection Discovery Queue State
     initial                    :  A
        1            A          :  B C     {A is removed and its children inserted}
        2            B          :  C D E   {B is removed and its only child inserted}
        3            C          :  D E F   {C is removed and its children inserted}
        4            D          :  E F G H {D is removed and its children inserted}
        5            E          :  F G H   {E is removed and has not children}
        6            F          :  G H I J {F is removed and its children inserted}
        7            G          :  H I J   {G is removed has no children}
        8            H          :  I J     {H is removed has no children}
        9            I          :  J       {I is removed has no children}
        10           J          :  (empty) {J is removed has no children}
    

    Above the iteration stops when we get that there is no more discovered vertex which are waiting to be selected, in the queue, so all the vertices which were discovered in the binary tree (graph connected component) is selected.

    I your code first you pass enqueue the nodes in queue and then traverse these childs again recursively, which creates a DFS pattern. If you have to do recursion, you need to check for if the queue is empty as the base condition. Also have a check how you are passing the queue, i think it may be incorrect. I would suggest an iterative solution.

提交回复
热议问题