【问题标题】:Printing levels of Tree in ClojureClojure中树的打印级别
【发布时间】:2015-11-15 17:53:29
【问题描述】:

我已经环顾四周,但无法找到一种方法来做到这一点。 我只是想逐层打印一棵树。

所以'[a [b c]] 会打印出来:

a
b c

【问题讨论】:

  • 没人? :P 我的脑袋完全被打乱了!
  • 我没有。我正在看它,从下午 1 点开始一直在做。好像有一个心理障碍正在发生。我来自Java背景????我正在使用 Stuart Halloway 的 Programming Clojure,但这并没有真正的帮助。
  • @DanielJour 抱歉忘记给你加标签...
  • 嗯,你想要的是树的广度优先遍历。我没有时间写答案 atm 但您应该能够使用该信息找到一些东西。
  • 可能不是您想要的,但仍然可能足够好。

标签: clojure


【解决方案1】:

如果我理解正确,这段代码应该可以工作:

(defn bf
  [root] 
  (if (vector? root)
    (let [roots (filterv (complement vector?) root)
          children (filterv vector? root)]
      (if-not (empty? children)
        (into [roots] (mapcat bf children))
        [roots]))
    root))

它不是惰性的,它返回一个包含节点的向量,例如

(bf ['a ['b 'c] 'd ['e 'f]]) => [[a d] [b c] [e f]]

打印出来:

(let [xs (bf ['a ['b 'c] 'd ['e 'f]])]
   (doseq [line (map str/join xs)] ; you need to require [clojure.string :as str]
     (println line)))

【讨论】:

  • articles.leetcode.com/2010/09/… 这就是我的意思,Marcin,尽管这正是我所需要的,但感谢您的努力。我希望你能从中得到比我更好的理解:(
  • 这一切都归结为您选择的表示。我无法理解它,对不起。这就是为什么我建议另一种表示形式,就 lisps 而言,这是一种更规范的表示形式。我的解决方案不适合你吗?您只需要一个一个地打印每个向量。
  • 如果您查看结果,每个向量对应于您要打印的一行(例如 [a d])。
  • 那么我如何一次打印出一个向量呢?
  • 谢谢,我看看这是否符合我的需要。它可能需要一些调整,但是是的 :) 虽然它们打印它们不一定在同一级别。
猜你喜欢
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 2014-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-04
  • 2022-01-16
相关资源
最近更新 更多