我正在开发一个学校项目,我们必须实现一个多态二叉搜索树,而不是使用对树的“空”部分的空引用,使用两个你应该使用多态的类(NonEmptyTree和EmptyTree)在应该采取某些行动时制定出来。
例如,如果我想在非多态二进制搜索树中插入特定键值,通常可以在移动树时递归地与null进行比较,只要获得compareTo值,就会粘贴在值中但是在这种情况下,由于这个EmptyTree类的设计(它只有一个实例),你基本上被禁止主动比较“EmptyTree.getInstance()”,它“释放”了EmptyTree的单个实例。 (getInstance()是一个静态方法)。
我使用到目前为止编写的代码附加了两个类的链接。我认为Pastebin的语法高亮比在这里插入我的所有代码更容易阅读,所以希望这没关系。
我不是在寻找解决方案或任何主要赠品,但我非常沮丧,因为以这种方式实现树似乎不合逻辑。 (我已经用空引用实现了一个相当完整的BST,但看起来这个练习毫无意义,因为我不知道如何继续前进)。另外,这要到下周日才能到期,所以我的愤怒根本不是拖延的结果,而是我个人不足的意识中的智力挫折。
感谢任何见解。
NonEmptyTree类: http://pastebin.com/
EmptyTree类: http://pastebin.com/
正如您所看到的,我广泛使用了EmptyTree.getInstance()方法,因为它似乎是一种或多或少有效的方法来检查我是否应该实例化一个新的NonEmptyList以粘贴在那个地方。但是,教授在项目规范中的用语具体说明:“您应该使用多态(以及适当的异常处理)来处理空树和非空树之间的差异。如果不这样做,将导致对您的大量负面调整项目等级。“
然而,我觉得这些说明与他上学期的讲座相矛盾,其中的信息“永远不会使用”控制流“的异常处理,即滥用捕获异常作为控制代码行为的方法。甚至我编写的使用try-catch块返回树的单一方法感觉就像亵渎神明。
答案 0 :(得分:0)
您可能会认为这是“解决方案”或“主要赠品”,但......
我同意这似乎有点愚蠢,至少在Java中。
但是,这个想法可能是让您的EmptyTree
和NonEmptyTree
类从某种PossiblyEmptyTree
基类继承,然后在每个类中以不同方式覆盖方法以实现正确的行为没有调用者知道(或检查)PossiblyEmptyTree
是否为空(即多态)。
您的解决方案中可能出现的一些代码:
public class EmptyTree ... {
...
public V search(K key) {
/* definitely not here! */
return null;
}
}