TreeSet / Contains方法

时间:2013-05-08 11:36:13

标签: java collections treeset

作为练习,我尝试实现自己的TreeSet。在编写添加和删除方法之前,我更喜欢从包含开始,这似乎更容易,但我被卡住了。

我的树由NodeLeaf组成:

static class Leaf<E extends Comparable<E>> implements Tree<E> {

                 //stuff
        @Override
        public boolean contains() {
           return false;
        }

}

这是Node类:

static class Node<E extends Comparable<E>> implements Tree<E> {

    private final E value;
    private Tree<E> left;
    private Tree<E> right;

   //some stuff
   @Override
   public boolean contains(E elem) {
       //here i'm blocked
   }
}

我怎么能对我的树说要用元素来研究它的好处(左或右)?

2 个答案:

答案 0 :(得分:2)

使用递归!

正如您所看到的,Leaf对象组成Tree的结尾,因此它将是该方法的停止条件。

您可以看到Tree中存储的对象必须实现Comparable。所以包含可以看起来像这样:

@Override
public boolean contains(E elem) {
    int compare = elem.compareTo(value); //here we compare the element with 
                                         //the compareTo method that the objects 
                                         //used must redefined

    if(compare==0)
            return true; //here the current node contains elem !
        else if(compare < 0)
            return left.contains(elem); //elem is inferior than the elem present in the current node hence we look into the left part of the tree
        else
            return right.contains(elem); //elem is superior than the elem present in the current node hence we look into the right part of the tree
    }

如您所见,如果Tree中没有该元素,我们最后会在Leaf内,并会返回false

您可以对代码addremove

实施相同的逻辑

答案 1 :(得分:2)

  

我怎么能对我的树说要用元素来研究它的好处(左或右)?

嗯,您需要使用elemvaluecompareTo进行比较。如果结果为0,则值已经相等,您可以返回true

如果elem小于value,则可以递归left.contains(elem),否则递归到right.contains(elem)。如果leftright值只是一个叶子,那么它将返回false,否则它将适当地递归。