为了遍历此BTree实现?

时间:2018-08-26 04:27:56

标签: scala b-tree inorder

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
}

然后他们继续使用ThreeNodeFourNode的模式

现在在BTree类中,我必须实现一个In Order函数,该函数返回已排序条目的列表。

// Return List of values sorted alphabetically/smallest to largest
def inOrder() : List[T] = 

任何人都可以帮助实现此目标吗?我想在inOrder函数内部,我有另一个函数被递归调用。但是我不知道如何处理列表。我是否在每次递归调用之前附加它?

任何帮助表示赞赏

2 个答案:

答案 0 :(得分:1)

尝试从未排序的树中读取值时对它们进行排序将变得不必要地复杂。

因此,您有两种选择:

1)将树中的所有值读入List,然后对List

进行排序

2)在构建树时将其排序,以便对于每个节点,left分支中的所有值都是<节点值和right中的所有值分支是>=节点值。然后,您可以通过按深度优先顺序从左到右遍历树来获得排序列表。在这种情况下,您将永远不会使用ThreeNodeFourNode(正如我在前面的答案中指出的那样),它们会使事情变得更加复杂。

这是使用二叉树对数据进行排序的经典方法。

答案 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来将子树保留在页面中所有其他内容的左侧。