二叉树 - Scala递归树的联合

时间:2017-08-03 16:14:34

标签: scala

这是我在Martin Odersky的Coursera第3周的视频讲座中看到的二叉树的实现:

abstract class IntSet
{
  def incl(x: Int): IntSet
  def contains(x: Int): Boolean
  def union(other: IntSet): IntSet
}

object Empty extends IntSet
{
  def contains(x: Int): Boolean = false
  def incl(x: Int): IntSet = new NonEmpty(x, Empty, Empty)
  def union(other: IntSet): IntSet = other

  override def toString = "."
}

class NonEmpty(elem: Int, left: IntSet, right: IntSet) extends IntSet
{
  def contains(x: Int): Boolean =
    if (x<elem) left contains x
    else if (x > elem) right contains x
    else true

  def incl(x: Int): IntSet =
    if (x<elem) new NonEmpty(elem, left incl x, right)
    else if (x > elem) new NonEmpty(elem, left, right incl x)
    else this

  def union(other: IntSet): IntSet =
    ((left union right) union other) incl elem

  override def toString = "{" + left + elem + right + "}"
}

So Empty和NonEmpty遵循IntSet概述的标准。我感兴趣的是NonEmpty类中的union方法。我想了解它的工作原理。

我在下面做了一个小小的描述来解释我的思考过程: enter image description here

对我来说,似乎那里有一个无限循环。但我更确定我在下面的地方犯了一个评估错误:

  1. ((L_1 U R_1)U O)incl e1
  2. ((L_3 U R_3)U R_1)incl e3
  3. (E U R_1)incl e3
  4. 2
  5. 3
  6. 2。 等等 等

1 个答案:

答案 0 :(得分:1)

让我们看看我是否可以使用你的图解析它。

((left union right) union other) incl elem变为:((L1 u R1) u OE1) incl 5

将内部括号扩展为:((L2 u R2) u R1) incl 3

L2R2都是空的,因此会折叠为:R1 incl 3,这是一个新的NonEmpty,不在您的图表中。

将其插入原始公式:((R1 incl 3) u OE1) incl 5

图表越来越难了,但正如您所看到的,我们已从计算中删除了L1,并将R1替换为新的稍大的NonEmpty。以这种方式继续,所有内容都将缩减为包含之前所有值的新IntSet