在二进制搜索树中添加检查有效性的位置

时间:2016-08-16 15:09:17

标签: java algorithm oop tree binary-search-tree

我知道这是一个非常具体的问题,但我不太确定如何更广泛地说出来,所以如果你在这里认识到更广泛的问题,请回答。我已经实现了大部分BinarySearchTree类,但我不确定在何处进行检查以确保它是有效的BinarySearchTree。目前我没有检查,但我正在考虑在该树上的每个相关操作之前检查(即在搜索之前检查,在进行树步行之前检查,在minimum之前检查等)以及树构建时。如果树无效,那么我将抛出IllegalArgumentException。但是,在我实现之前,我考虑改为创建一个新的BinarySearchTreeNode类,它扩展BinaryTreeNode(我正在使用的类),而是在BinarySearchTreeNode类中进行检查(在建设和每当孩子们设置)。 所以,我不需要任何这样的实现(我已经有isValidBinaryTree方法),但这是最佳实践:从不检查树是否有效,检查树是否有效树的构造,在每个方法调用树之前,或者在构造期间和子项设置时进行BinarySearchTreeNode类检查?
仅供参考,您实际上不需要知道二进制搜索树是什么。它只是一种二叉树(每个节点有0-2个子节点),其中左子节点的值是< =父节点的值,右子节点的值是> =父节点的值树中的所有节点(这就是我所说的有效树)。

2 个答案:

答案 0 :(得分:1)

在我看来,检查你的树(或其他一些数据结构)是否有效是最合乎逻辑的。 在二进制搜索树的情况下,每次插入或移除节点时检查有效性。 如果只是通过插入节点来构造树,那么您可以在构造期间免费获得有效性检查。 如果以其他方式进行施工(例如盲目地复制某些数据),那么您也希望在施工后立即检查有效性。

每次查询搜索树时进行有效性检查都没有多大意义,因为查询不会对其进行更改 (但是如果你在更改它时进行检查,你可以确定树结构是好的。)

另外,如果可能的话,在实际进行修改之前检查修改是否会导致结构无效(而是抛出异常)。

答案 1 :(得分:1)

你的班级将有合同。对二叉搜索树的合理期望是每个这样的树确实是二叉搜索树的合同。这称为不变

操作这样一棵树的每一个操作都应该这样做,使得这个不变量永远不会被破坏

这意味着对于每个操作,您需要确保在方法完成时,对象仍然代表一个包含所有不变量的二叉搜索树。

当然,您可以通过选择API来轻松或难以实现。如果您的树公开了允许不变量被公开的内部方法,那么您的设计已损坏

因此,您应该设计公共API ,以确保每个公共方法都能保留不变量。

例如,空树确实是二叉搜索树。如果您的addremove方法确保不变量保持(并且没有其他方法操纵树的状态存在),那么根本没有理由在搜索之前检查这些不变量是否为真。如果你做得对,你可以写一个证明,他们必须在那一刻是真的。