比较器和BST

时间:2012-10-08 11:39:49

标签: java binary-search-tree

我试图创建一个允许我检查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的两个元素上使用。我如何解决这个问题,以便我可以继续运行比较器?

2 个答案:

答案 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方法。