作为练习,我尝试实现自己的TreeSet
。在编写添加和删除方法之前,我更喜欢从包含开始,这似乎更容易,但我被卡住了。
我的树由Node
和Leaf
组成:
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
}
}
我怎么能对我的树说要用元素来研究它的好处(左或右)?
答案 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
。
您可以对代码add
和remove
答案 1 :(得分:2)
我怎么能对我的树说要用元素来研究它的好处(左或右)?
嗯,您需要使用elem
将value
与compareTo
进行比较。如果结果为0,则值已经相等,您可以返回true
。
如果elem
小于value
,则可以递归left.contains(elem)
,否则递归到right.contains(elem)
。如果left
或right
值只是一个叶子,那么它将返回false
,否则它将适当地递归。