二叉搜索树上的Scala联合运算

时间:2017-04-02 20:52:56

标签: scala binary-search-tree

我是Scala的新手,我不知道后续代码from this link如何在二叉搜索树上运行:

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
}

我没有得到的是联合操作如何按排序顺序创建新树以及它如何正常工作,它是否会到树的末尾然后逐个添加元素? 另外我不知道这个递归是如何终止的,就Java来说它应该给我们NullPointerException

1 个答案:

答案 0 :(得分:4)

总结算法是如何工作的(因为只有部分算法在问题中,终止在Empty的情况下):

要使两个TweetSet联合起来,请看左边的那个:

  • 如果它是空的,那么联合应该是另一个,所以Empty union that == that

  • 如果它非空,则它具有根元素elemleft子树和right子树。然后由leftrightthatelem元素中的所有元素以及元素union形成联合,因此我们在所有元素上递归调用union那些。

在最后一种情况下,为了确保我们终止,每个union调用中的左元素应该小于初始调用(否则,我们将陷入左手的递归循环中left union (right union that) 的一边会变得越来越大。表达式

right

确切地说:

  • NonEmpty(elem, left, right)小于最初的right union that(正确的子树),因此left最终会被计算

  • left union (...)也小于初始树,因此最终也会计算elem

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