【问题标题】:In order traversal for this BTree implementation?为了遍历这个 BTree 实现?
【发布时间】:2018-08-26 04:27:55
【问题描述】:

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 函数内部思考,我有另一个递归调用的函数。但我不知道如何处理列表。我是否在每次递归调用之前附加它?

任何帮助表示赞赏

【问题讨论】:

  • 您还没有修复上一个问题中的OneNode。它需要继承自BTree而不是Node,并且需要有一个值成员u1才能与TwoNode保持一致。
  • 我看不出OneNode 元素如何存在于正确的B-tree 中。单个子节点不能同时表示小于和大于节点键(数据)值,如果没有键,则它应该是EmptyNode,不需要子节点。
  • @Tim 它的任务,它是我们得到的骨架。我不认为我们可以改变它
  • @jwvh 是的,它不存在于正确的 BTree 中。但是在进行删除等操作时会用到它

标签: scala b-tree inorder


【解决方案1】:

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

所以你有两个选择:

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

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

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

【讨论】:

  • 是的,BTree 是自平衡的,对吧?因此,顺序深度优先遍历将是要走的路。关于算法和 Scala,我只是对它的工作逻辑有疑问。
  • @AlonzoRobbe 二叉树不是自平衡的,它只是一个树结构,每个节点最多有两个分支。用于排序的二叉树可以是自平衡的,也可以不是自平衡的,具体取决于实现。如果您的 BTree 具有 ThreeNodeFourNode 元素,则它不是二叉树。
  • 对不起,我的意思是B-Tree
【解决方案2】:

我不太明白你的结构的意图。 我希望 B-Tree 节点看起来像这样:

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

【讨论】:

  • 这是一个作业,所以我不能改变结构的制作方式
  • @AlonzoRobbe 但您可以向它们添加方法,不是吗?所以,只需将val smaller = Seq(t) 添加到OneNode,并将val smaller=t1; val data=Seq(u1 -> Seq(t2)) 添加到TwoNode 等等......
  • 不幸的是,我不允许这样做
  • 那么你的问题“现在在 BTree 类中,我必须实现一个 In Order 函数”没有意义......
  • 为什么不呢?它在 abstract sealed class BTree 中,它扩展了 Node 并导入了 BTree 对象(我不小心从我的问题中省略了)
猜你喜欢
  • 1970-01-01
  • 2011-02-17
  • 2011-05-29
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多