Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
二叉搜索树上的Scala并集运算_Scala_Binary Search Tree - Fatal编程技术网

二叉搜索树上的Scala并集运算

二叉搜索树上的Scala并集运算,scala,binary-search-tree,Scala,Binary Search Tree,我是Scala新手,我一直无法理解以下代码如何在二叉搜索树上工作: def union(that: TweetSet): TweetSet = { (left union (right union that)).incl(elem) } def incl(x: Tweet): TweetSet = { if (x.text < elem.text) new NonEmpty(elem, left.incl(x), right) else if (elem.text

我是Scala新手,我一直无法理解以下代码如何在二叉搜索树上工作:

def union(that: TweetSet): TweetSet = {
    (left union (right union that)).incl(elem)
}

def incl(x: Tweet): TweetSet = {
    if (x.text < elem.text) new NonEmpty(elem, left.incl(x), right)
    else if (elem.text < x.text) new NonEmpty(elem, left, right.incl(x))
    else this
}
def联合(that:TweetSet):TweetSet={
(左联轴节(右联轴节))。包括(元素)
}
def incl(x:Tweet):TweetSet={
if(x.text
我不明白的是,union操作是如何按排序顺序创建新树的,以及它是如何工作的,它是否会到达树的末尾,然后逐个添加元素?
此外,我不知道这个递归将如何终止,就Java而言,它可能会给我们NullPointerException来总结算法的工作原理(因为只有一部分是在这个问题中,终止是在
空的情况下):

要将两个
TweetSet
s合并,请查看左侧的一个:

  • 如果它是空的,则该并集应该是另一个,因此
    empty union that==that

  • 如果它不是空的,那么它有一个根元素
    elem
    、一个
    子树和一个
    子树。然后,联合由
    left
    中的所有元素、
    right
    中的所有元素、
    that
    中的所有元素以及元素
    elem
    组成,因此我们对所有这些元素递归调用
    联合

在最后一种情况下,为了确保到达终止点,每个
联合
调用中的左元素应该小于初始调用(否则,我们将陷入递归循环中,
联合
的左侧将越来越大)。表情

left union (right union that)
正是这样做的:

  • right
    小于初始的
    NonEmpty(elem,left,right)
    (作为其右子树),因此将最终计算出
    右并集

  • left
    也比初始树小,因此
    left union(…)
    最终也将得到计算

然后我们添加最后缺少的元素
elem
,以构建最终的
TweetSet
。请注意,如果尝试将此算法应用于小集合,则会返回到将第一个集合的所有元素逐个添加到第二个集合,从最大的元素(初始树右侧最远的元素)开始。特别是,第二个集合的大小不影响算法的长度