合并两个树集

时间:2017-08-06 04:19:10

标签: scala set

我正试图获得两套联盟。基本上是二叉树(但保证平衡)。这是代码:

class MyNonEmptySet extends MySet{

union(that: MyNonEmptySet): MySet = {
    ((left union right) union that) incl elem
  }

}

class MyEmptySet extends MySet{
    union(that: MyNonEmptySet): MySet = that    
}

对于较小的数据集,联合可以正常工作,但是当数据较大时,联合不会返回。它继续下去。我想了解出了什么问题。如果它没有返回它应该至少耗尽内存(堆栈溢出异常),对吧?我怎么能纠正这个?

#EDIT1

如果我在NonEmptySet的实现中更改了paranthesis,那么它是有效的。

(left union (right union that)) incl elem

我不明白为什么?两者都应该给出相同的结果吗?为什么一种方法需要永远(但不会耗尽内存)而另一种方法可以立即用于相同的数据?

1 个答案:

答案 0 :(得分:0)

二叉树是一个好的数据结构的原因是它被排序,因此你可以在log n时间进行快速搜索。

看起来你没有使用排序的二叉树。

您的第二个算法有效但所有工作都由

完成
incl elem

这很慢。

第一个算法有一个递归步骤,它正在进行自身的并集,但它永远不会离开递归步骤。

Scala中有很好的树集算法,我只想使用其中一种算法。

合并二叉树的正确方法是使用红黑树,但这不重要: https://www.wikiwand.com/en/Red%E2%80%93black_tree