0

我有一个以这种方式实现节点的二叉树:

public class BinaryTreeNode<T>
{
    T element;
    BinaryTreeNode<T> leftChild;  // left subtree
    BinaryTreeNode<T> rightChild; // right subtree
}

我正在尝试搜索保存在树中的最大值,但我未能创建一个成功的方法来实现这一点。这是我尝试过的:

public void maxElement(Method visit)
{
    ArrayList<T> a = new ArrayList<>();
    BinaryTreeNode<T> b = root;

    while(b != null)
    {
        try
        {
            visit.invoke(null, b); //This visit Method is to traverse the nodes
        }
        catch(Exception e)
        {
            System.out.println(e);
        }

        if(b.leftChild != null)
            a.add(b.leftChild.element);
        if(b.rightChild != null)
            a.add(b.rightChild.element);

        Collections.sort(a); //Here is where it fails
        System.out.println(a.get(0));
    }
}

这是 IDE 抛出的错误:

绑定不匹配:Collections 类型的泛型方法 sort(List) 不适用于参数 (ArrayList)。推断的类型 T 不是有界参数的有效替代品

我知道我尝试对泛型类型进行排序失败,但是不知道如何实现我想要的。

4

2 回答 2

3

如果T期望是支持比较的类型,那么您应该声明

public class BinaryTreeNode<T extends Comparable<T>> {

您应该将其理解为“T 类型的对象必须与 T 类型的其他对象具有可比性”。

于 2013-11-08T20:16:51.973 回答
0

要解决您的问题,您可以将afrom 的定义更改ArrayList<T> a = new ArrayList<>();List<T> a = new ArrayList<>();

一些旁注:

  1. 你应该遵循@Louis Wasserman 的建议——这对你的老师的执行方式有 0 的影响,它仅仅意味着可以BinaryTreeNode<Integer>,但BinaryTreeNode<Object>例如不是。换句话说,您只是限制了 T 可以是什么-这样它就更干净了,并提供了有关元素的前期信息
  2. a变量名很重要,特别是如果你做学校作业,我一开始就迷路了b:(
于 2013-11-08T21:04:21.503 回答