我们发现,二叉树在判断左右结点时,是根据(int) t和(int)value的大小关系,但是如果二叉树插入的对象不是int类型,那么是无法实现类型转换的,也就无法进行插入了。
为了解决这个问题,我们把Node设计为
public class Node<T extends Comparable<T>> {}
表示只能接受那些实现了Comparable接口的泛型,也就是说只要实现过Comparable接口的类,都可以用这个二叉树,而左右结点的判断也变得简单了,t和value都是T 类型,而T类型extends Comparable,所以必然可以调用compareTo方法。
package collection;
import java.util.ArrayList;
import java.util.List;
import charactor.GiantDragon;
import charactor.Hero;
public class Node<T extends Comparable<T>> {
public Node<T> leftNode;
public Node<T> rightNode;
public T value;
public void add(T t) {
if (null == value)
value = t;
else {
//t和value都是T 类型,而T类型extends Comparable,所以可以使用compareTo方法
if (t.compareTo(value) <= 0) {
if (null == leftNode)
leftNode = new Node<T>();
leftNode.add(t);
}
else {
if (null == rightNode)
rightNode = new Node<T>();
rightNode.add(t);
}
}
}
public List<T> values() {
List<T> values = new ArrayList<>();
if (null != leftNode)
values.addAll(leftNode.values());
values.add(value);
if (null != rightNode)
values.addAll(rightNode.values());
return values;
}
public static void main(String[] args) {
int randoms[] = new int[] { 67, 7, 30, 73, 10, 0, 78, 81, 10, 74 };
Node<Integer> roots = new Node<>();
for (int number : randoms) {
roots.add(number);
}
System.out.println(roots.values());
//Hero实现了 Comparable接口,所以可以作为Node的泛型
Node<Hero> heros = new Node<>();
//GiantDragon 没有实现 Comparable接口,所以不能作为Node的泛型
Node<GiantDragon> dragons = new Node<>();
}
}