如何在 Clojure 中遍历一棵树,同时收集每个节点节点的值?

2024-04-10

我想创建一个函数来收集二叉树中每个节点的值。在 ClojureDocs 中,我发现了几个用于遍历树/图的函数,例如 tree-seq、prewalk 和 postwalk。

https://clojuredocs.org/clojure.core/tree-seq https://clojuredocs.org/clojure.core/tree-seq

https://clojuredocs.org/clojure.walk/prewalk https://clojuredocs.org/clojure.walk/prewalk

https://clojuredocs.org/clojure.walk/postwalk https://clojuredocs.org/clojure.walk/postwalk

这些都可以用来累加遍历的节点的值吗?作为 Clojure 新手,我不知道该怎么做。如果您知道如何操作(使用 Clojure 或类似的 Lispy 语言),请告诉我。理想情况下,Clojure 新手可以理解您的答案;-)

我的二叉树用这样的节点表示:(值左孩子右孩子)。例如:

( 2 (7 零 零) (88 (5 零 零) 零) )

在这个例子中,我希望函数返回 (2 7 88 5)。

注意:遍历方法并不重要。我只是想学习一种收集节点值的技术。


Well, tree-seq将为您提供节点序列(深度优先遍历的)。然后您可以对其进行任何其他转换,包括(map some-value-extractor-fn (tree-seq ...获取每个节点中的值。您只需要选择一个树表示和该表示的适当函数,这样tree-seq可以知道什么是内部节点以及它的子节点是什么。 例如,使用您对树的定义作为嵌套列表:

嵌套列表树

我们的树可以分支的节点是列表,我们可以使用list?.他们的孩子是继第一个孩子之后的价值观,即他们的孩子rest。因此我们可以仅使用标准函数来定义 tree-seq:

(->> '( 2 (7 nil nil) (88 (5 nil nil) nil) )
     (tree-seq list? rest))

但这有一点垃圾 - 每个nil作为 seq 的成员出现,我们感兴趣的每个值都出现在其列表节点中并作为其本身的成员,依此类推。我们可以用一个清理这个filter or remove- 例如,我们可以丢弃所有叶子值并仅采用内部节点:

(->> '( 2 (7 nil nil) (88 (5 nil nil) nil) )
     (tree-seq list? rest)
     (filter list?))
;;=> ((2 (7 nil nil) (88 (5 nil nil) nil)) (7 nil nil) (88 (5 nil nil) nil) (5 nil nil))

然后就map first超过那些:

(->> '( 2 (7 nil nil) (88 (5 nil nil) nil) )
     (tree-seq list? rest)
     (filter list?)
     (map first)) ;;=>(2 7 88 5)

或者,我们可以尝试丢弃树的内部节点和零节点,只获取具有值的叶子:

(->> '( 2 (7 nil nil) (88 (5 nil nil) nil) )
     (tree-seq list? seq)
     (remove (some-fn list? nil?))) ;;=>(2 7 88 5)

请注意,在这个策略中我必须使用seq而不是rest,因为我希望列表中的第一个值也是该节点的子节点。(some-fn list? nil?)是一些高阶函数 - 它构建一个函数来检查输入是否满足either谓词的list? or nil?(或两者)。

嵌套地图树

如果您想要一个可能更通用的树定义,其中每个节点可以包含多个值以及可变数量的子节点,您可以将树定义为嵌套映射:{:value 2 :children [{:value 7} {:value 88 :children [{:value 5}]}]}

在这种情况下,仅将地图视为节点通常是最简单的。我们可能的分支节点是地图 - 检查它map?。我们把他们的孩子存放在钥匙里:children,它是一个关键字,因此也是一个函数。我们使用该函数来获取孩子。

(->> {:value 2 :children [{:value 7} {:value 88 :children [{:value 5}]}]} 
     (tree-seq map? :children)) 
;;=> ({:value 2, :children [{:value 7} {:value 88, :children [{:value 5}]}]} {:value 7} {:value 88, :children [{:value 5}]} {:value 5})

然后你只需要map通过节点来获取您想要的数据:

(->> {:value 2 :children [{:value 7} {:value 88 :children [{:value 5}]}] } 
     (tree-seq map? :children)
     (map :value)) ;;=> (2 7 88 5)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Clojure 中遍历一棵树,同时收集每个节点节点的值? 的相关文章

  • 是否有一个在线工具可以像 JSON 一样自动缩进和格式化 Clojure 代码?

    有很多在线工具可以获取 JSON 文本 并向您显示该文本的格式化和缩进格式 有些甚至更进一步 形成了一个漂亮的树状结构 http jsonviewer stack hu http jsonviewer stack hu 我们有类似的 Clo
  • clojure 中的反转哈希映射

    我在 clojure 中有哈希映射 key1 value1 key2 value2 key3 value1 我需要将其转换为哈希映射 value1 key1 key3 value2 key2 有 Clojure 方法可以做到这一点吗 clo
  • Clojure 函数 - 返回最后一条语句之前计算的值

    我有一些用 Clojure 编写的测试 这是一个简单的例子 defn test1 start server run pvt and expect PVT 0 stop server 我想返回 run pvt and expect 的结果 但
  • 将数据库结果转为数组

    我刚刚为组织查询分层数据的 闭包表 方式制作了更新 添加 删除部分 如本幻灯片第 70 页所示 http www slideshare net billkarwin sql antipatterns strike back http www
  • java与maven和eclipse中的clojure混合

    我创建了一个示例多语言程序 我有一个用java实现的传感器和一个机器人 以及用clojure实现的AI 我无法正确连接maven src main java clojuretest DistanceSensor java AI clj us
  • 从命令行将 clojure 源代码编译为类(AOT)(不使用 lein)

    我正在尝试将 clojure 源代码编译成类文件 并仅使用命令行运行它 没有 lein 也没有 可能 回复 我有 core cljsrc hello目录 src hello core clj 这是源代码 ns hello core defn
  • 在我的 Linux 机器上安装 lisp

    我使用 Vim 作为我的编辑器 Practical common Lisp 建议安装 Lispbox 我不知道如何使用 emacs 不知道如何用那个 T T 运行 lisp 代码 之后我找到了一个名为 limp vim 的 vim lisp
  • 为什么leiningen启动时那么慢?

    我在用着lein repl在控制台中执行 clojure repl 当我运行它时 需要超过15秒 当我跑步时java cp clojure 1 6 0 jar clojure main 只需几秒钟 Why is lein repl太慢了 有
  • 在 Light Table 中使用 Datomic 时出现“无读取器功能”错误

    当我在 lighttable 中评估这段代码时 ns app core require datomic api refer q as d reload all defn add person conn id d transact conn
  • 用 pandas 查找树中叶节点的所有祖先

    我有一个表 有两列 父 和 子 这是从 SAP ERP 下载的 SETNODE 表 需要在 python 中创建一个数据框 其中每个级别作为其自己的列 相对于其父级和之前的所有级别 在Python 3 中 完整关系的级别数量未知 或始终变化
  • 这两个 clojure 函数之间有什么区别和问题?

    对于课程项目的一部分 我正在实现一个函数来从文件中读取一些数据并根据该文件创建图形结构 一整天我问了几个问题 结果就是这样 下面是一个可以正常工作的函数 它首先以惰性序列的形式读入文件 然后循环解析每一行并将其打印出来 defn print
  • 为什么 LISP 中符号名称中的连字符是约定俗成的?

    这个推荐的理由是什么 为什么不与使用下划线的其他编程语言保持一致 我认为 LISP 使用连字符有两个原因 历史 和 因为你可以 History LISP 是一种古老的语言 在早期输入下划线可能会很困难 例如 我用于 LISP 的第一个终端是
  • 解决斐波那契数列的 Lisp 方法

    我想尝试学习 Lisp 但很快就放弃了 我想我会再试一次 我正在看 求 400 万以下所有偶数斐波那契数的总和 我写了下面的代码 它可以工作 但是很丑陋 其中最主要的是它太慢了 因为它一直在进行简单的递归 当我用 Python 编写这个程序
  • 将向量作为绑定传递给 for 宏时出现问题

    我有任意数量的列表 我想使用 for 宏来处理它们 我想创建一个传递向量作为绑定的函数 因为列表的数量各不相同 如果我对绑定进行硬编码 它会按我的预期工作 gt def list1 pink green gt def list2 dog c
  • 如何使用KDTrees实现最近邻搜索?

    所以 我正在实施一个KD Tree http en wikipedia org wiki Kd tree进行最近邻搜索 我已经构建了树部分 但我认为我没有完全理解搜索部分 关于遍历树来搜索邻居 维基百科文章如下 Starting with
  • gensym 在 Lisp 中做什么?

    我听到一些同学谈论他们如何使用该功能gensym为此 我问他们它做了什么 甚至在网上查了一下 但我真的无法理解这个函数的作用是什么两者都不为什么或何时最好使用它 特别是 我对它在 Lisp 中的作用更感兴趣 谢谢你们 独特且未被拘禁的符号
  • java数据结构模拟数据树

    我需要帮助定义使用什么方法 我有一个 SOAP 响应 给我一个 xml 文件 我需要在屏幕上显示 3 个相关列表 当您在第一个列表中选择一个项目时 相应的选择将出现在第二个列表中 依此类推 我只对从 xml 流中提取数据后如何有效地组织数据
  • 非二叉树的中序树遍历

    对于比二叉树更宽的树 术语 中序遍历 是否有明确定义的含义 或者 前 和 后 顺序是唯一有意义的 DFS 类型吗 我的意思是与n每个节点 gt 2 个子节点 我猜是为了n这甚至可能意味着之后要转到 根 n 2孩子们 但这曾经这样使用过吗 那
  • 在抛出异常之前重试某件事 3 次 - 在 clojure 中

    我不知道如何在Clojure中实现这段Python代码 for i in range 3 try except e if i 2 raise e else continue else break 我想知道为什么在 Python 中如此简单的
  • 学习 Lisp 的资源 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi

随机推荐

  • 用 C 语言实现 FIFO 队列

    对于嵌入式应用程序 我尝试使用 ANSI C 实现先进先出 FIFO 结构队列 最直接的方法似乎是通过实现链表 以便每个结构包含指向队列中下一个的指针 因此我将结构本身定义为 typedef enum LED on LED off etc
  • 错误:尝试使用 id==grid1 注册小部件,但该 id 已注册

    我目前正在开发我的个人网站我对我的网站的一部分有一个偏见 即避免重复代码 这个视图我有一个 dojox grid datagrid 我可以在同一页面中调用此视图两次 ruban phtml 问题是我单击 1 个按钮 这是该视图 部分视图 的
  • 如何在Matlab中找到连通分量?

    数组A 2 3 2 5 4 8 5 6 7 8 我想得到的结果为 conidx 2 3 5 6 和 4 7 8 2 3 的值之一存在于第二行 2 5 的值之一存在于第 4 行 因此 2 3 2 5 和 5 6 连接起来 最后我可以得到连接索
  • 打字稿错误“无法写入文件...因为它会覆盖输入文件。”

    在 Visual Studio 2015 Update 3 中的 Typescript 2 2 1 项目中 我在错误列表中收到数百个错误 例如 无法写入文件 C my project node modules buffer shims in
  • 将图形对象转换为位图

    我的图形对象确实有以下问题 EDIT 我有一个图片框图像 图像RxTx 这是来自摄像机的实时流 我在绘制事件中所做的就是在图像 imageRxTx 上绘制一些线条 下面的代码中未显示 到目前为止 这没有问题 现在我需要检查 imageRxT
  • 如何找到距离原点最近的坐标?

    我知道有很多关于按多个值对 javascript 数组进行排序的问题 但没有一个答案解决了我的问题 我有一个坐标数组 例如 x y 10 20 12 18 20 30 5 40 100 2 如何获取距离原点最近的坐标 使用以下方法计算每个点
  • 快速多重替换为字符串

    我有一个如下所示的字符串 A jahshs b jwuw c wuqjwhaha d e f jsj g 我需要更换每一个 x 用不同的字符串 问题来了 因为这个过程将重复大约 1000 次 秒 所以我需要一种优化 快速的方法来完成它 任何
  • 如何优化 HTML 表格中的多个重复图像

    我正在生成一个大型 HTML 表格 并且对许多单元格使用图像 例如 一列可能具有拇指向上的图像或拇指朝下的图像 如果我有 300 行 其中 200 行竖起大拇指 那么它们都有 a href link img src http myserve
  • .NET 中小数、浮点和双精度之间的区别?

    有什么区别decimal float and double在 NET 中 什么时候有人会使用其中之一 float C 别名为System Single and double C 别名为System Double are 漂浮的binary点
  • List.add 和手动添加项目到 Riverpod StateNotifier> 之间的区别

    我想学习如何使用Riverpod https riverpod dev 因此为此我正在实现一个小应用程序 该应用程序显示项目列表和一个按钮 该按钮在点击时将虚拟项目添加到列表中 问题背景 按下以下应用程序中的按钮将按预期工作 添加一个虚拟项
  • MKMapView居中并放大

    我在一个项目中使用 MKMapView 希望将地图置于坐标中心并放大 就像 Google 地图一样 GMSCameraPosition camera withLatitude 33 8683 longitude 151 2086 zoom
  • 使用 bootstrap css 打印

    我有一个带有 bootstrap css 布局的页面 我正在尝试打印表格 然而 该表看起来与屏幕上的完全不同 我包含这样的 css 文件 有没有办法让打印的表格看起来与屏幕上的一样 或者我是否必须为我想要打印的表格创建一个特定的 css 文
  • 当 access_type=online 时,“此应用程序希望:具有离线访问权限”

    我有一个带有 OAuth 2 0 身份验证的 Google 应用程序 一切过去都工作正常 但最近我开始收到以下 请求许可 屏幕 奇怪的是 当我经过时 我看到这个屏幕access type online 同样 这种方法直到最近才有效 造成这种
  • 在 Scala 3 中派生不透明类型的类型类实例

    Scala 3 有没有办法使用derives关键字与不透明类型别名结合使用 最好有一种无样板的方法 通过自动依赖基础类型 如果有 的相同类型类的实例来为给定的不透明类型别名提供类型类实例 如果能够表达类似的东西就好了 opaque type
  • 将逗号分隔的字符串解析为某种可以循环访问各个值的对象的最简单方法?

    将逗号分隔的字符串值列表解析为可以循环的某种对象的最简单方法是什么 以便我可以轻松访问各个值 示例字符串 0 10 20 30 100 200 我对 C 有点陌生 所以请原谅我问这样一个简单的问题 谢谢 这有一些问题 但最终最简单的方法是使
  • 子类如何访问父类的属性?

    我有一个关于 Javascript 对象的问题 如何访问父类的属性 function randomObj for example button obj this text this is obj function parentClass t
  • dreamhost 上的 SSH 密钥

    我正在尝试设置与 dreamhost 和我的本地计算机配对的 SSH 密钥 我使用 git bash 作为我的终端 使用 mingw32 我可以通过 ssh 电子邮件受保护 cdn cgi l email protection并要求我提供密
  • rspec,未知属性问题

    我正在 优秀的 railstutorial org 网站上工作 有一个关于 rspec 的基本问题 当我在新用户模型上运行以下测试时 我收到 未知属性 用户名 消息和失败的测试 before each do attr lname e gt
  • 从 IE EPM BHO 内访问命名管道服务器

    我正在尝试对我们的旧产品进行一些更改 以支持 BHO 上的 IE EPM 我已经设法加载它并调用各种方法 SetSite DocumentComplete 等 当我尝试连接到 Windows 服务中运行的命名管道服务器时 我似乎遇到了障碍
  • 如何在 Clojure 中遍历一棵树,同时收集每个节点节点的值?

    我想创建一个函数来收集二叉树中每个节点的值 在 ClojureDocs 中 我发现了几个用于遍历树 图的函数 例如 tree seq prewalk 和 postwalk https clojuredocs org clojure core