scala的新学习者。我具有所有节点和BTree的这些基类
abstract sealed class Node[T](implicit val ord : Ordering[T])
abstract sealed class BTree[T](implicit ord : Ordering[T])
extends Node[T] {
def size : Int
def depth : Int
这是基本案例的结尾
object BTree {
//empty node
final case class EmptyNode[T]()(implicit ord : Ordering[T])
extends BTree[T] {
val size : Int = 0
val depth : Int = 0
}
//node with 1 child
final case class OneNode[T](t : BTree[T])(implicit ord : Ordering[T])
extends Node[T] {
val size : Int = t.size
val depth : Int = t.depth + 1
}
//node with 2 children
final case class TwoNode[T](t1 : BTree[T], u1 : T, t2 : BTree[T])
(implicit ord : Ordering[T]) extends BTree[T] {
val size : Int = t1.size + t2.size + 1
val depth : Int = max(t1.depth, t2.depth) + 1
}
然后他们继续使用ThreeNode
和FourNode
的模式
现在在BTree
类中,我必须实现一个In Order函数,该函数返回已排序条目的列表。
// Return List of values sorted alphabetically/smallest to largest
def inOrder() : List[T] =
任何人都可以帮助实现此目标吗?我想在inOrder
函数内部,我有另一个函数被递归调用。但是我不知道如何处理列表。我是否在每次递归调用之前附加它?
任何帮助表示赞赏
答案 0 :(得分:1)
尝试从未排序的树中读取值时对它们进行排序将变得不必要地复杂。
因此,您有两种选择:
1)将树中的所有值读入List
,然后对List
2)在构建树时将其排序,以便对于每个节点,left
分支中的所有值都是<
节点值和right
中的所有值分支是>=
节点值。然后,您可以通过按深度优先顺序从左到右遍历树来获得排序列表。在这种情况下,您将永远不会使用ThreeNode
或FourNode
(正如我在前面的答案中指出的那样),它们会使事情变得更加复杂。
这是使用二叉树对数据进行排序的经典方法。
答案 1 :(得分:0)
我不太了解您的结构的意图。 我希望B树节点看起来像这样:
case class Node[T](smaller: Seq[Node[T]] = Nil, data: Seq[([T], Seq[Node[T]])] = Nil) {
def inOrder: Seq[T] = smaller.flatMap(_.inOrder) ++
data.flatMap { case (value, children) =>
children.flatMap(_.inOrder) :+ value
}
}
假设相应子数据中的“子级”始终位于“右侧”(因此需要smaller
来将子树保留在页面中所有其他内容的左侧。