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;
}
Сначала узел head
вставляется в очередь. Цикл будет повторяться, пока очередь не пуста. Начиная с головного узла, в каждой итерации один узел удаляется, и ненулевые дочерние элементы вставляются в очередь. В каждой итерации выходит один узел, а его ненулевые дочерние элементы выдвигаются. На следующей итерации следующая самая старая обнаруженная вершина, которая сейчас находится в начале очереди, вынимается (в порядке их обнаружения), а затем обрабатывается для проверки своего потомка.
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}
Над итерацией останавливается, когда мы получаем, что в очереди больше нет обнаруженных вершин, ожидающих выбора, поэтому выбираются все вершины, которые были обнаружены в двоичном дереве (компонент, связанный с графом).
В вашем коде сначала вы ставите в очередь узлы в очереди, а затем рекурсивно перебираете эти дочерние элементы, что создает шаблон DFS. Если вам нужно выполнить рекурсию, вам нужно проверить, пуста ли очередь, как базовое условие. Также проверьте, как вы проходите очередь, я думаю, что это может быть неправильно. Я бы предложил итеративное решение.