【问题标题】:Idiomatic Kotlin for Level Order Traversal of BST用于 BST 级别顺序遍历的惯用 Kotlin
【发布时间】:2018-06-06 01:20:56
【问题描述】:

以下是我对 BST 的 Level Order Traversal 的实现:

fun levelOrder(): Iterable<Pair<Key, Int>> {
    class InternalNode(val node: Node<Key>, val level: Int)

    val yetToVisit = emptyQueue<InternalNode>()
    val visited = emptyQueue<Pair<Key, Int>>()

    root?.also { yetToVisit.enqueue(InternalNode(it, 1)) }

    while (!yetToVisit.isEmpty) {
        do {
            val node = yetToVisit.dequeue().also { visited.enqueue(it.node.key to it.level) }
            listOf(node.node.left, node.node.right)
                    .filter(Objects::nonNull)
                    .map { InternalNode(it!!, node.level + 1) }
                    .forEach(yetToVisit::enqueue)
        } while (!yetToVisit.isEmpty && yetToVisit.peek().level == node.level)
    }

    return visited
}

我想知道是否可以在不使用whiledo-while 的情况下以更惯用/更实用的方式实现上述内容。想法?

【问题讨论】:

  • 建议使用filterNotNull,而不是filter(Objects::nonNull),这样会妨碍你在下一次map操作中使用!!操作符。

标签: algorithm data-structures tree kotlin binary-search-tree


【解决方案1】:

是的,您可以使用sequence(例如generateSequence):

fun levelOrder(): Iterable<Pair<Key, Int>> {
    class InternalNode(val node: Node<Key>, val level: Int)

    val yetToVisit = emptyQueue<InternalNode>()
    val visited = emptyQueue<Pair<Key, Int>>()
    fun peek() = yetToVisit.dequeue()
            .also { visited.enqueue(it.node.key to it.level) }

    root?.also { yetToVisit.enqueue(InternalNode(it, 1)) }
    if (yetToVisit.isEmpty) return visited
    generateSequence(peek()) { node ->
        if (!yetToVisit.isEmpty && yetToVisit.peek().level == node.level) peek()
        else null
    }.forEach { node ->
        listOfNotNull(node.node.left, node.node.right)
                .map { InternalNode(it, node.level + 1) }
                .forEach(yetToVisit::enqueue)
    }

    return visited
}

顺便说一句,您可以使用listOfNotNulllistOf().filterNotNull 替换filter(Objects::nonNull)

请注意,我只是在语法上重构了您的代码,但由于我无法编译您的代码,因此无法验证它的正确性。如果它没有按预期工作,请发表评论。

【讨论】:

  • 您的代码无法编译,因为generateSequence 中的变量node 未定义。
  • @AbhijitSarkar 已修复
  • 你的代码和我的逻辑不同,遍历测试失败。我建议在提出进一步(不正确的)解决方案之前运行它。
  • 因为我不知道peekenqueuedequeue是怎么实现的。我猜dequeuepopenqueueadd 并写了上面的代码。稍作修改
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-14
  • 1970-01-01
  • 2017-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多