【发布时间】: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
}
我想知道是否可以在不使用while 和do-while 的情况下以更惯用/更实用的方式实现上述内容。想法?
【问题讨论】:
-
建议使用
filterNotNull,而不是filter(Objects::nonNull),这样会妨碍你在下一次map操作中使用!!操作符。
标签: algorithm data-structures tree kotlin binary-search-tree