1

我正在做一个学校项目,我们必须实现一个多态二叉搜索树,而不是使用对树的“空”部分的空引用,而是使用两个类(NonEmptyTree 和 EmptyTree),你应该使用多态来解决什么时候应该采取某些行动。

例如,如果我想在非多态二叉搜索树中插入特定的键值,通常您可以在遍历树时递归地与 null 进行比较,每当获得 compareTo 值为 0 时就保留您的值。但是在这种情况下,由于这个 EmptyTree 类的设计(它只有一个实例),您基本上被禁止主动与“释放”EmptyTree 的单个实例的“EmptyTree.getInstance()”进行比较。(getInstance() 是一个静态方法)。

我正在使用到目前为止编写的代码附加到这两个类的链接。我认为 Pastebin 的语法高亮比在这里插入我所有的代码更容易阅读,所以希望这没问题。

我不是在寻找解决方案或任何重大赠品,但我非常沮丧,因为以这种方式实现树似乎不合逻辑。(我已经用空引用实现了一个相当完整的 BST,但似乎这个练习毫无意义,因为我不知道如何前进)。此外,这要到下周日才到期,所以我的愤怒根本不是拖延的结果,而是对我个人能力不足的理智上的挫败感。

任何见解都值得赞赏。

NonEmptyTree 类: http://pastebin.com/

EmptyTree 类: http ://pastebin.com/

如您所见,我广泛使用 EmptyTree.getInstance() 方法,因为它似乎是一种或多或少有效的方法来检查我是否应该实例化一个新的 NonEmptyList 以固定在该位置。但是,教授在项目规范中的话特别指出:“您应该使用多态性(以及适当的异常处理)来处理空树和非空树之间的差异。如果不这样做,将对您的项目等级。”

然而,我觉得这些说明与他上学期的讲座相矛盾,其中的信息是“永远不要对“控制流”使用异常处理,即滥用捕获异常作为控制代码行为的一种方式。” 即使是我编写的使用 try-catch 块返回 Tree 的单一方法也感觉像是亵渎神明。

4

1 回答 1

0

您可能会认为这是一个“解决方案”或“主要赠品”,但是......

我同意这似乎有点愚蠢,至少在 Java 中是这样。

但是,这个想法可能是让您的EmptyTreeNonEmptyTree类从某种PossiblyEmptyTree基类继承,然后在每个基类中以不同的方式覆盖方法以实现正确的行为,而调用者不知道(或检查)是否PossiblyEmptyTree为空(多态性) .

您的解决方案中可能出现的一些代码:

public class EmptyTree ... {
    ...

    public V search(K key) {
        /* definitely not here! */
        return null;
    }
}
于 2012-10-28T04:10:32.393 回答