【问题标题】:Lazy tree traversal iterator in ScalaScala中的惰性树遍历迭代器
【发布时间】:2015-11-12 12:23:42
【问题描述】:

如果我的树是这样定义的:

case class Node(value: Int, children: Seq[Node])

但是为了论证,假设访问孩子是昂贵的,因此我只想在我实际需要时遍历它们。

如果Node 上的非严格、急切的 DFS 遍历被定义为

def traverse(node: Node): Unit = {
  node.children foreach { child => traverse(child) }
}

如何创建它的惰性对应物?

理想情况下,我将有一个 iterator 方法,该方法返回一个基于 DFS 遍历排序的迭代器,该迭代器仅在调用 next() 时评估下一个元素:

val tree = Node(1, Seq(Node(2, Nil), Node(3, Nil)))
val dfsIt = tree.iterator // get a iterator with a DFS traversal ordering
val nextNode = dfsIt.next() // compute which element to return on demand

【问题讨论】:

  • 我认为您的示例代码有误,应该是 node.children foreach { child => traverse(child) } 。注意traverse(child) 而不是traverse(node)
  • 你是对的。谢谢!

标签: scala iterator lazy-evaluation tree-traversal


【解决方案1】:
case class Node(value: Int, children: Seq[Node]) {

  def dfsIterator: Iterator[Node] = {
    println(value)
    children.iterator.map(_.dfsIterator).flatten ++ Iterator(this)
  }
}

【讨论】:

    猜你喜欢
    • 2012-09-20
    • 2013-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多