我试图创建一个允许我检查BST是否包含项目的方法。这就是我到目前为止所做的:
public boolean contains(Object item) {
// YOUR CODE HERE
//changes item to E so it can be used in the comparator
E value1 = (E) item;
if (root.value.equals(item)){
return true;
}
comp.compare(value1,root.value);
if(value1<root.value){
if (left == null)
return null;
else
return left.contains(item);
}
else if(item >= value){
if (right == null)
return null;
else
return right.contains(item);
}
}
这些是我的领域:
// Data fields
private BSTNode root;
private int count = 0;
private Comparator<E> comp; // default comparator
/** Private class for the nodes.
* Has public fields so methods in BSTSet can access fields directly.
*/
private class BSTNode {
// Data fields
public E value;
public BSTNode left = null;
public BSTNode right = null;
// Constructor
public BSTNode(E v) {
value = v;
}
}
public BSTSet() {
comp = new ComparableComparator(); // Declared below
}
public BSTSet(Comparator <E> c) {
comp = c;
}
我的问题是我如何修复我的包含方法以使其有效。到目前为止,它到达comp.compare(value1.root.value)下的行,并说'&lt;'不能在类型E的两个元素上使用。我如何解决这个问题,以便我可以继续运行比较器?
答案 0 :(得分:3)
你的比较器返回一个int。
如果此int为0,则两个对象的值相同,如果它小于0,则它等于你的&lt;,如果它大于0,则它等同于你的&gt;。
您需要使用比较器调用的结果来检查是否应该遍历右侧或左侧子树。
另外,如果左/右分支为空,请不要返回null,返回false。这是算法的正确语义,如果没有左分支且值小于当前根,则该项不在树中,因此为false。
答案 1 :(得分:0)
您可以拥有以下内容:
public boolean containsItem(int i) {
Node<Integer> t = new Node<Integer>(i);
Node<Integer> r = (Node<Integer>) root;
while(r != null){
int cmp = t.compareTo((Node<Integer>) r);
if(cmp == 0)
return true;
if(cmp >0 ) r = r.getRight();
else r = r.getLeft();
}
return false;
}
您可以查看我的博客,了解如何为BST实施compareTo方法。