二叉搜索树上的Scala并集运算
我是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
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
。请注意,如果尝试将此算法应用于小集合,则会返回到将第一个集合的所有元素逐个添加到第二个集合,从最大的元素(初始树右侧最远的元素)开始。特别是,第二个集合的大小不影响算法的长度