使用可比较或比较器实施BST

时间:2015-02-17 09:53:13

标签: java comparator comparable

我试图创建一个通用的BinarySearchTree<T>类。我想提供两个选项(构造函数),

  1. 实现Comparable<T>的泛型类的空构造函数,即如果Dog是实现Comparable<Dog>的类,则:

    BinarySearchTree<Dog> bst = new BinarySearchTree<Dog>();

  2. Comparator<T>传递给无需实施Comparable<T>的通用类,即如果 Dog 是一个类(未实现Comparable<Dog> )和 DogComp 是一个实现Comparator<Dog>然后

    的类

    BinarySearchTree<Dog> bst = new BinarySearchTree<Dog>(new DogComp());

  3. 我的BinarySearchTree类中有一个Comparator字段。对于空的consrtuctor,我将创建新的比较器。如果比较器通过,我将简单地将其分配给该比较器字段。

    我应该如何声明类和构造函数?

2 个答案:

答案 0 :(得分:3)

不考虑将用于决定插入节点的位置的实际逻辑,您可以这样做:

public class BinarySearchTree<T> {

    private Node root;
    private Comparator<T> comparator;

    public BinarySearchTree() {

    }

    public BinarySearchTree(Comparator<T> comparator) {
        this.comparator = comparator;
    }

    public void insert(T obj) {
        // binary search tree logic for deciding where to insert the node
        // Create a Node
        // ....
        // comparison of two nodes
        if (obj instanceof Comparable) {
            // compare using Comparable
        } else if (comparator != null) {
            // compare using Comparator
        } else {
            //objects cannot be compared
        }
    }

    /*Represents a node for the tree */
    private class Node {
        T obj;
        Node left;
        Node right;

        public Node(T obj) {
            super();
            this.obj = obj;
        }
    }
}

另请注意,不是对每个新插入执行instanceOf检查,而是可以在构造函数本身中添加该检查,如果数据未实现可比较或比较,则抛出异常。

答案 1 :(得分:2)

我想改进机器人的答案:

使用抽象BinarySearchTree方法创建compare类摘要。然后,两个内部静态具体类可以实现两种方案。而不是构造函数,提供两种构造方法,如:

public static <E> BinarySearchTree<E> create(Comparator<? super E> comp) {
    return new ComparatorSearchTree(comp);
}

public static <E extends Comparable<E>> BinarySearchTree<E> create() {
    return new ComparableSearchTree();
}

这样,类的其余部分可以只使用你的compare(one,other)方法,而不关心结果是来自比较器还是自然元素顺序。

您可能已经注意到我将comp指定为Comparator<? super E>。这意味着比较器逆变。这使得搜索树更加灵活,因为这样您就可以放入任何能够比较E对象的比较器,即使比较器只比较F对象,其中F是E的超类。