实现二进制搜索树 - 包含方法

时间:2014-10-10 23:34:20

标签: java binary-search-tree

我目前有3个类 - DictionaryApp,BSTSet和BSTNode - BSTSet和BSTNode都包含方法。

public class BSTSet <E extends Comparable<E>> extends AbstractSet <E> {

    // the root of the supporting binary search tree
    private BSTNode<E> root;

    // number of elements in the set
    private int count = 0;


    public boolean isEmpty() {
        return count == 0;
    }


    public boolean contains(E item) throws ClassCastException {
        if(root == null) return false;
        return root.contains(item);
    }

    public boolean add(E item) {
        if (item == null) 
            throw new IllegalArgumentException("Null cannot be added to a BSTSet");
        if(contains(item))return false;
        if(root == null){
            root = new BSTNode(item);
            count++;
            return true;
        }else{
            root.add(item);
            count++;
            return true;
        }
    }
}


public class BSTNode <E extends Comparable<E>> {

    private E value;
    private BSTNode<E> left;
    public BSTNode<E> right;

    public BSTNode(E value) {
    this.value = value;
    }

    public E getValue() {
        return value;
    }

    public BSTNode<E> getLeft() {
        return left;
    }

    public BSTNode<E> getRight() {
        return right;
    }


    public boolean contains(E item) {
        if(item.compareTo(value) == 0) return true;
        if(left != null) left.contains(item);
        if(right != null) right.contains(item);
        // no matching node was found
        return false;

    }

     public boolean add(E item) {
        if(item.compareTo(value) < 0) {left = new BSTNode(item); return true;}
        if(item.compareTo(value) > 0) {right = new BSTNode(item); return true;}
        return false;
    }
}

我的问题是BSTNode类中的contains方法永远不会返回true,我无法理解为什么。如果您想再查看我的代码或需要更多信息,请随时提出。

1 个答案:

答案 0 :(得分:5)

BSTNode contains方法中,您忽略了在containsleft上调用right的结果。如果子节点找到它,请立即返回true。此外,使用比较结果确定下一个要搜索的子项。

public boolean contains(E item) {
    int comp = item.compareTo(value);
    if(comp  == 0) return true;
    if(comp < 0 && left != null && left.contains(item)) return true;
    if(comp > 0 && right != null && right.contains(item)) return true;
    // no matching node was found
    return false;
}

您的add方法会忽略可能已存在的所有子节点。首先测试他们的存在。如果它们不存在,请按照您已经在进行的方式进行分配。如果它们已经存在,则以递归方式对该孩子进行add

public boolean add(E item) {
    if(item.compareTo(value) < 0) {
        if (left == null) left = new BSTNode(item); return true;
        else return left.add(item);
    }
    if(item.compareTo(value) > 0) {
        if (right == null) right = new BSTNode(item); return true;
        else return right.add(item);
    }
    return false;
}