Проблема в том, как вы управляете своей очередью. Используйте одиночный while
l oop, который проверяет длину списка. В это время вытолкните первый узел, а затем расширьте очередь дочерними элементами вытолкнутого узла. Ваша функция должна выглядеть так:
def traverseBF(self, node):
li = []
trav = []
li.append(node)
while len(li) != 0:
x = li.pop(0) # pop the first item
li.extend(x.children) # extend the queue with children
trav.append(x.data)
print(trav)
Здесь t.traverseBF(t.root)
печатает [1, 2, 3, 4, 5, 6, 7, 8]
.
Вот «более чистая» версия вашего кода. Мне нравятся генераторы, поэтому я превратил его в генератор, который один за другим возвращает значения узлов в порядке BFS:
def bfs(node):
q = [node]
while q:
n = q.pop(0)
q.extend(n.children)
yield n.data
[*bfs(t.root)]
# [1, 2, 3, 4, 5, 6, 7, 8]