如何在 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 中遍历一棵树,同时收集每个节点节点的值? 的相关文章

  • 将 Lambda 表达式树与 IEnumerable 结合使用

    我一直在尝试了解有关使用 Lamba 表达式树的更多信息 因此我创建了一个简单的示例 这是代码 如果作为 C 程序粘贴到 LINQPad 中 它可以工作 void Main IEnumerable
  • 如何使用clojure中的map函数打印哈希映射列表的每个元素?

    我正在构建一个哈希映射列表 然后将其传递给另一个函数 当我尝试使用打印列表中的每个哈希映射时map它不工作 我可以打印完整列表或获取第一个元素等 defn m a println a map println a 以下仅适用于 repl m
  • Lisp:使用语法糖访问递归哈希

    我正在尝试构建一个函数 或宏 来简化哈希表深处数据的获取和设置 也就是说 哈希中的哈希 哈希中的哈希等 我不认为我可以用宏来做到这一点 而且我不知道如何用 eval 来做到这一点 我希望能够执行以下操作 gethashdeep HEROES
  • 是否可以在 Java 中创建对象树?

    我正在尝试用 Java 创建对象树 我还想使用一个 Java 类 可以轻松地在树中添加或删除节点 用于此目的的最佳类是什么 示例 这是一个对象数组 数组顶部的对象是字符串 world 这里的叶子是整数 我想添加字符串 This is at
  • 使用Lisp或Scheme进行Java程序的运行时配置

    我现在看到几个项目在实际配置取决于仅在运行时可用的东西时结束 配置 Java 程序的典型方法是根据某些应用程序特定规则读取一个或多个属性文件 然后根据它们的值采取操作 在某一时刻 这种情况会崩溃 您需要在配置中使用实际的程序逻辑 然后可以用
  • 如何在 Lisp 中生成一系列佩尔数而不是特定的数

    如何使用 cons 或其他方式打印列表佩尔数 https en wikipedia org wiki Pell number直到第N个数 defun pellse k if or zerop k k 1 k 2 pellse k 1 pel
  • 从 PHP 中的平面路径数组构建目录树

    所以 标题可能令人困惑 但我不知道如何表达这种数组结构 它肯定是一个树结构 但至于它的创建 这正是我所渴望的 它似乎不遵循典型的递归数组树构建 我正在尝试从平面路径数组创建列目录布局 每个路径都位于其自己的多维数组内 该数组旨在构建 mac
  • Clojure 的分析工具?

    有谁知道 Clojure 有一个好的分析工具或库吗 我更喜欢可以从 REPL 中使用的东西 类似于 with profiling 过去是在 Allegro Common Lisp 中 有什么类似的事情吗 或者您是否有过与 Clojure 配
  • 将嵌套映射分解为键值对

    我想将 Clojure 中的嵌套映射分解为一系列键值对 例如 我们有这张地图 a b c d e f g h i j 分解后的地图应如下所示 a b c d e f g h i j d e f g h e f g h i j 输出的顺序并不
  • 使用命令行界面构建 Clojure 应用程序?

    我刚刚开始使用 Clojure 来自 Ruby 我想构建一个带有命令行界面的小型应用程序 如何处理 CL 的输入 输出 我注意到有一个 clojure contrib command line 但文档很少 http github com r
  • 惰性序列内部究竟如何工作

    我是 clojure 的新手 不清楚惰性序列在内部是如何工作的 或者更具体地说 返回惰性序列的函数意味着只有在需要时才会计算结果 例如在下面的例子中 defn fc lazy fn xs lazy seq if let xss seq xs
  • 在 Clojure 中处理两个序列中的值对

    我正在尝试加入 Clojure 社区 我经常使用 Python 我广泛使用的功能之一是 zip 方法 用于迭代值对 在 Clojure 中是否有一种 聪明且简短的 方法可以实现相同的目标 另一种方法是简单地将 map 与一些按顺序收集其参数
  • 如何将 clojure Web 应用程序部署到 Amazon EC2(AWS Elastic Beanstalk + Leiningen + Compojure + Ring + Tomcat)

    如题 我的IDE是intellij idea 12 1 4 我需要什么工具包或插件才能 将 Clojure Web 应用程序部署到 Amazon EC2 有任何链接或参考或分步解决方案吗 谢谢 如果您只是部署一个 war 文件 没有其他自定
  • 一次性的 lisp 宏,我的实现正确吗?

    我正在尝试从 Peter Seibel 的书 Practical Common Lisp 中学习 Lisp 在第 8 章 宏 定义你自己的 http www gigamonkeys com book macros defining your
  • Lisp 函数如何记住这段代码中的状态?

    我从网站上看到一段代码http www ccs neu edu home shivers newstyle html http www ccs neu edu home shivers newstyle html gt defun elem
  • 在树结构的 Big-O 表示法中:为什么有些来源引用 O(logN),有些来源引用 O(h)?

    在研究遍历二叉搜索树的任何算法的复杂性时 我看到两种不同的方式来表达同一件事 版本 1 最坏情况下的遍历算法对树的每个高度进行一次比较 因此复杂度是O h 版本 2 最坏情况下的遍历算法对树的每个高度进行一次比较 因此复杂度是O logN
  • 浏览器显示 clojure 环中不存在 access-control-allow-origin 标头

    我通过客户端浏览器向服务器发出请求 如下所示https example com bar https example com bar 但出现错误 Access to XMLHttpRequest at https example com ba
  • (Emacs) 文本是只读的?

    所以我在 emacs 中工作 突然 slime repl sbcl 说文本是只读的 嗯 这很好 因为现在我无法在其中输入任何内容 我该如何修复 缓冲区是只读的 可以通过以下方式解决C x C q但正如德鲁和菲尔斯所说 文本是只读的 是非常不
  • Clojure 为什么命名为 Clojure

    为什么该语言的名称是 Clojure 我用谷歌搜索了一下 在 clojure 中询问 到目前为止 还没有运气 Rich Hickey 他是 Clojure 的设计者 对此的评论是 wiki 上的第一个参考链接 您是否根据以 closure
  • 没有这样的命名空间:clojurescript 项目设置中的 clojure.spec.alpha

    我在尝试学习clojure spec 在沿着启动构建工具设置 clojure 项目时 我在需要 clojure spec alpha 时遇到以下错误 Compiling ClojureScript js app js No such nam

随机推荐

  • 用 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