graph - 嵌套映射到表示 Clojure 中的边的元组序列

标签 graph clojure tree traversal

如何在惯用的 Clojure 中表达以下转换?

(def m
     {:a {:b {:c nil
              :d nil}
          :e nil}})


(map->edges m) ; =>


([:a :b] [:b :c] [:b :d] [:e nil] [:d nil] [:a :e] [:e nil])

我不关心向量在结果中出现的顺序,所以深度优先或呼吸优先搜索策略都可以。

最佳答案

您可以使用 for 相当简洁地表达这一点和 tree-seq :

(defn map->edges [m]
  (for [entry m
        [x m] (tree-seq some? val entry)
        y (or (keys m) [m])]
    [x y]))

例子:

(map->edges m)
;;=> ([:a :b] [:a :e] [:b :c] [:b :d] [:c nil] [:d nil] [:e nil])

关于graph - 嵌套映射到表示 Clojure 中的边的元组序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45699736/

相关文章:

javascript - Angular 2 D3 树渲染不正确

algorithm - CLRS B-Tree 属性节点可以包含的键数的下限和上限

algorithm - 计算 split 为 1 的树的时间复杂度 :3 ratio unlike binary tree

用于绘制区域的 Javascript 图形库

c# - 可变数量矩形的动态数据显示图

maven - 自动化 Leiningen 本地依赖管理

functional-programming - 精心设计的功能性 Web 应用程序的源代码?

algorithm - 在图的生成树中找到最大比率最小切割

python - RRD 值错误

Clojure:检查两个原子中具有相同键的值是否相等(使用 add-watch)