我有一个用于类的方法,该方法使用二进制搜索树数据结构实现一组整数。其中一种方法是contains
方法,如果一组包含给定的整数,则该方法返回true
下面两种方法的实现都是正确的,但是我试图理解为什么要这样做:
def contains(x: Int): Boolean =
if (x < elem) left.contains(x)
else if (elem < x) right.contains(x)
else true
与穷举和用这种方式做相比,足够了:
def contains(x: Int): Boolean =
if (x < elem) left.contains(x)
else if (elem < x) right.contains(x)
else if (elem == x) true
else false
如果整数不属于集合,第一种方法中的方法返回false的直观原因是什么?
答案 0 :(得分:1)
始终构造二叉搜索树,以使左分支的元素小于节点值elem
,而右分支元素均大于elem
。
如果您的x
既不小于也不大于elem
,则遵循此逻辑,您只有一种可能性:它等于elem
。因此,无需测试是否相等,第二个实现的else false
将永远是无效分支。
这样想:如果您使用两个数字,而两个数字都不小于或大于另一个,则它们必须是相同的数字。
答案 1 :(得分:1)
您应该保持可疑,因为看来结束递归的唯一方法是返回true
。
但是我认为您会发现树对于节点元素和叶元素具有不同的类。您显示的是节点的contains
方法。叶子的contains
方法将仅返回false
,从而结束递归操作。
或者,left
和right
可能是Option[Node]
。在这种情况下,如果false
是Option
,则会得到None
,因为None.contains(_)
始终是false
。