] Скажем, у меня есть дерево, определенное в соответствии с рекомендацией в этом посте , хотя в моем случае это вектор, что, надеюсь, не имеет значения (это векторы в книге Programming Clojure):
(def tree [1 [[2 [4] [5]] [3 [6]]]])
что должно быть что-то вроде:
1
/ \
2 3
/ \ |
4 5 6
Теперь я хотел бы выполнить обход дерева в ширину -без каких-либо традиционных средств, таких как очередь, и вместо этого использовать исключительно стек для передачи информации. Я знаю, что это не самый простой маршрут, но я делаю это в основном как упражнение.Также на данный момент я не планирую возвращать коллекцию (. Я разберусь с этим позже в качестве упражнения ), а вместо этого просто распечатаю узлы по мере их прохождения.
Мое текущее решение (только начинается с Clojure, будь милым):
(defn breadth-recur
[queue]
(if (empty? queue)
(println "Done!")
(let [collections (first (filter coll? queue))]
(do
; print out nodes on the current level, they will not be wrapped'
; in a [] vector and thus coll? will return false
(doseq [node queue] (if (not (coll? node)) (println node)))
(recur (reduce conj (first collections) (rest collections)))))))
Последняя строка не работает должным образом, и я не знаю, как это исправить. Я точно знаю, чего хочу. :Мне нужно очистить каждый слой векторов, а затем соединить результаты, чтобы передать их в recur.
Проблема, которую я вижу, в основном:
IllegalArgumentException Don't know how to create ISeq from: java.lang.Long
В основном conj не любит добавлять вектор к длинному, и если я заменяю conj на concat , то я терплю неудачу, когда один из двух элементов, которые я объединяю, не является вектор. И conj, и concat терпят неудачу при столкновении с:
[2 [4] [5] [3 [6]]]
Я чувствую, что мне не хватает действительно базовой операции, которая работала бы как с векторами, так и с примитивами в обеих позициях.
Какие-либо предложения?
Редактировать 1:
На самом деле дерево должно быть (спасибо, Джуст!):
(def tree [1 [2 [4] [5]] [3 [6]]])
Однако мы до сих пор не нашли ширину-первое решение.