Java 为BST实现哈希代码

Java 为BST实现哈希代码,java,binary-search-tree,equals,Java,Binary Search Tree,Equals,在Java中,要比较两个相等的反对意见,必须同时实现equals方法和hashCode方法。我需要比较两个BST是否相等。在这种情况下,如何实现hashCode方法?现在,在节点类上实现hashCode非常简单:假设我的数据是int。但是我不能仅仅添加节点的值来检查树是否相等。那我该怎么做呢?有人成功地做到了吗 我在想我能做的很多不同的事情,但我不确定它们的可伸缩性。例如,我可以使用级别顺序,并为每个级别乘以一个大素数,但我不能确定这是否可行。所以也许有人能更好地理解我。谢谢 我不能仅仅添加节点

在Java中,要比较两个相等的反对意见,必须同时实现
equals
方法和
hashCode
方法。我需要比较两个BST是否相等。在这种情况下,如何实现
hashCode
方法?现在,在
节点
类上实现
hashCode
非常简单:假设我的数据是
int
。但是我不能仅仅添加节点的值来检查树是否相等。那我该怎么做呢?有人成功地做到了吗

我在想我能做的很多不同的事情,但我不确定它们的可伸缩性。例如,我可以使用级别顺序,并为每个级别乘以一个大素数,但我不能确定这是否可行。所以也许有人能更好地理解我。谢谢

我不能仅仅添加节点的值来检查树是否相等

当然可以
hashCode
s不必是唯一的,如果两个BST具有相同的内容,那么在每种情况下对节点内容求和将得到相同的结果,这符合
hashCode
契约。请记住--
返回0
始终是
hashCode()
的有效实现;不需要唯一性

(事实上,对节点内容的hashCode求和就是如何实现
TreeSet.hashCode()

另一方面,如果您关心结构,您可以做一些简单的事情,比如用

int h = contents.hashCode();
h = h * 31 + Objects.hashCode(leftChild);
h = h * 31 + Objects.hashCode(rightChild);
return h;

…这也会得到一个关于哈希函数的不错的结构。

你需要检查树的结构是否相同,或者只是内容吗?@LouisWasserman,我从来没有想过这一点。谢谢我猜两者都有。是的,结构和内容都是。我越想它,就越意识到结构对我来说意义重大。但是谢谢你的
TreeSet.hashCode()
:+1。为这种情况添加了一个实现。在这种情况下,我如何实现equals方法?与其他任何对象的实现方式相同?检查内容是否相等,检查左侧子项是否相等,检查右侧子项是否相等。