Озадачены функциональной широтой -первого обхода дерева в Clojure?

] Скажем, у меня есть дерево, определенное в соответствии с рекомендацией в этом посте , хотя в моем случае это вектор, что, надеюсь, не имеет значения (это векторы в книге 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]]])

Однако мы до сих пор не нашли ширину-первое решение.

20
задан Community 23 May 2017 в 12:32
поделиться