DFS나 BFS나 concat 순서 하나 차이임. 더군다나 테일리커전이라 스택도 안쓰고.
한줄요약: 남자는 재귀
;;;;;
(defrecord Node [name children])
(def A (->Node "A" []))
(def B (->Node "B" [A]))
(def C (->Node "C" []))
(def D (->Node "D" [B C]))
(defn tree-search [node name dfs-or-bfs]
(let [search-fn (cond (= dfs-or-bfs :dfs)
(fn [nodes children] (concat children nodes))
(= dfs-or-bfs :bfs)
(fn [nodes children] (concat nodes children))
:else (Exception. (str "Unknown search method " dfs-or-bfs)))]
(letfn [(fn-for-node [node nodes]
(if (= (:name node) name)
node
#(fn-for-nodes (search-fn nodes (:children node)))))
(fn-for-nodes [[node & more-nodes]]
(if (empty? node)
nil
#(fn-for-node node more-nodes)))]
(trampoline fn-for-node node []))))
(tree-search D "A" :bfs)
(tree-search D "A" :dfs)
사실 그래프만 만들면 어렵지 않지.... 그래프를 직접 구현하기 힘들어서ㅋㅋㅋ 어휴 자료구조때 뒤지는 줄... 트리보단 쉬웠다만