泛型二叉树的问题

我们发现,二叉树在判断左右结点时,是根据(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<>();
         
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值