Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 不带null的多态二叉搜索树;空节点";_Java_Project_Binary Search Tree - Fatal编程技术网

Java 不带null的多态二叉搜索树;空节点";

Java 不带null的多态二叉搜索树;空节点";,java,project,binary-search-tree,Java,Project,Binary Search Tree,我正在学校的一个项目中工作,我们必须实现一个多态二叉搜索树,它不是使用空引用来“清空”树的部分,而是使用两个类(NonEmptyTree和EmptyTree),你应该使用多态性来确定什么时候应该执行某些操作 例如,如果我想在非多态二叉搜索树中插入一个特定的键值,通常您可以在遍历树时递归地与null进行比较,每当您得到一个compareTo值0时,就保留您的值。但是在这种情况下,由于这个EmptyTree类的设计(它只有一个实例),本质上禁止您主动与“EmptyTree.getInstance()

我正在学校的一个项目中工作,我们必须实现一个多态二叉搜索树,它不是使用空引用来“清空”树的部分,而是使用两个类(NonEmptyTree和EmptyTree),你应该使用多态性来确定什么时候应该执行某些操作

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

我用我迄今为止编写的代码附加到这两个类的链接。我认为Pastebin的语法突出显示比在这里插入我的所有代码更容易阅读,所以希望这是可以的

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

任何见解都值得赞赏

非空树类:

EmptyTree类:

如您所见,我广泛使用了EmptyTree.getInstance()方法,因为这似乎是检查是否应该实例化一个新的非空列表以保持在该位置的一种或多或少有效的方法。然而,该教授在项目规范中明确指出:“你需要使用多态性(以及异常处理,如果合适的话)来处理空树和非空树之间的差异。如果不这样做,你的项目分数会有很大的负面调整。”

然而,我觉得这些说明与他上学期的讲座相矛盾,他的讲座中的信息是“永远不要将异常处理用于“控制流”,即滥用捕获异常作为控制代码行为的一种方式。”甚至我写的一个使用TestCcatch块返回树的方法都像是亵渎神灵。

< P>你可以认为这是一个“解决方案”或“重大赠送”,但是…

我同意这看起来有点傻,至少在Java中是这样

不过,这个想法可能是让您的
EmptyTree
NonEmptyTree
类从某种
PossiblyEmptyTree
基类继承,然后在每个类中不同地重写方法,以实现正确的行为,而无需调用方知道(或检查)如果
PossiblyEmptyTree
为空或不为空(即多态性)

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

public class EmptyTree ... {
    ...

    public V search(K key) {
        /* definitely not here! */
        return null;
    }
}

我理解你的沮丧。但是请记住,如果不觉得有点毫无意义,就很难写出关于Java语言特定部分的问题。关于不使用异常来控制程序流,您是对的——我想知道教授是否真的在寻找异常,或者他的问题是否措辞糟糕。也许下次见面时可以澄清一下?你会因为谈论他以前的讲座而得到分数:-)嘿,我已经连续写了7个小时了。我把一切都弄明白了。基本上,正如Samuel所说,整个练习的重点是将大多数变量声明为类型“Tree”,然后因为我们有两个继承类(EmptyTree和NoneptyTree),我们可以简单地在其中一个类方法中指定我们希望发生的行为类型。例如,我们可以递归地调用一个“insert”方法,在传入“NonEmptyList”的整个过程中,compareTo方法检查键以将其固定在正确的位置,然后当一个空列表