java – 为BST实现equals和hashcode

这个问题是 Implementing hashCode for a BST的后续问题.我的问题很难想到,所以我得到了一个我不确定如何使用的答案.

我需要为BST实现equals:这样如果两个BST在结构和内容上相等,那么equals返回true.因此,我想我还需要实现hashCode函数.我得到了hashCode函数的答案,使得树的结构和内容相同.

@Override
puclic int hashCode(){
  int h = Objects.hashCode(data);//data is int
  int child=0;
  if(null != left)
    child =left.hashCode();
  if(null != right)
    child+= right.hashCode();
  if(0<child) h= h*31+child;
  return h;
}

但是,我如何实现equals函数?如果树木在结构和内容上都相同,那么下面的工作是否会起作用?

@Override
public boolean equals(Node otherRoot){
   return root.hashCode() == otherRoot.hashCode();
}

有可能出现误报的情况吗?

或者我的hashCode应该是

@Override
public int hashCode(){
  int h = contents.hashCode();
  h = h * 31 + Objects.hashCode(leftChild);
  h = h * 31 + Objects.hashCode(rightChild);
  return h;
}

而在后一种情况下,我的平等会避免误报吗?

解决方法

Will the following work iff the trees are equal in both structure and content? root.hashCode() == otherRoot.hashCode()

不,它不起作用,因为哈希码相等是单向的:当对象相等时,哈希码必须相等.但是,当对象不相等时,哈希码可能相同也可能不相等.一旦你应用了pigeonhole principle,这是有意义的:可能的哈希码的数量大约是4B,而可能的BST的数量实际上是无限的.

您可以使用与构建哈希代码相同的方式构建比较 – 即递归:

>检查被比较节点的值是否相等.如果值不同,则返回false>检查两个节点是否都有左子树.如果其中一个有左子树而另一个没有,则返回false>检查两个节点是否都有正确的子树.如果其中一个具有正确的子树而另一个没有,则返回false>递归应用等于左子树.如果结果为false,则返回false>递归应用等于右子树.如果结果为false,则返回false>回归真实

相关文章

Java中的String是不可变对象 在面向对象及函数编程语言中,不...
String, StringBuffer 和 StringBuilder 可变性 String不可变...
序列化:把对象转换为字节序列的过程称为对象的序列化. 反序...
先说结论,是对象!可以继续往下看 数组是不是对象 什么是对...
为什么浮点数 float 或 double 运算的时候会有精度丢失的风险...
面试题引入 这里引申出一个经典问题,看下面代码 Integer a ...