Найдите сами, что такое и с чем едят b-tree,
а также что такое узлы и ребра (это то из чего состоят графы и деревья),
как создать граф (дерево) и совершать обходы по нему.
Поверьте, это гораздо интересней, чем мучать процессор 12-ю вложенными циклами.
Ну а по теме наверное так:
import networkx as nx
G = nx.balanced_tree(2,12)
print (G.edges()) # выведет все дуги дерева
print (G.nodes()) # выведет все узлы дерева
А дальше какой хотите обход делайте по дереву.
Или так:
Вместо print(allwood) сохраняйте путь в список:
all_paths.append(allwood).
Не забудьте до циклов проинициализировать all_paths = [].
Получите матрицу(таблицу), в каждой строке которой один из путей,
столбец указывает на уровень графа (дерева) - готовая адресация.
Если же в каждом узле надо хранить какой-то объект, то тогда используйте
networkx конечно - он позволяет представить узел от простой переменной до хранения инициализированного экземпляра класса любой сложности.