实现二叉树(通用)的compareTo(Comparable <t>)</t>

时间:2015-01-09 22:59:36

标签: java generics nodes compareto

我正在使用键值节点生成二叉树。

它的工作原理如下:example Binary Tree(those numbers are the keys)

订购如下: 如果你实现一个新节点,你给出一个键和一个值(不重要),它将检查是否已经有一个节点,如果没有,它将创建它作为第一个节点。现在它检查密钥是否小于第一个节点的密钥,如果是,如果没有密钥则将其作为左节点,如果有,它将迭代到那个并再次检查它。对于更大的键/右节点也是如此。如果密钥等于当前节点的密钥,它将覆盖节点。

如果我使用类似int的东西,这个方法是有效的。 现在我想把它作为通用的,所以我想从Comparable接口添加compareTo,因为我可以检查密钥是否小于,等于或大于当前节点的密钥。我知道我必须使用密钥,但我自己无法编写任何compareTo方法。我不知道如何让它发挥作用。

@Override
public int compareTo(TreeNode<Type> node) {
    //method
}

我目前在我的程序中使用的属性是: 节点(第一个,上一个,左,右),键,值 键入键,值 节点myNodes(上一个,......)

classdefinitions:

public class Tree<Type> {
    ...
    public class TreeNode<Type extends Comparable<Type>>{
        ...
    }
    public int compareTo(TreeNode<Type> Node){
        //method
    }
}

2 个答案:

答案 0 :(得分:4)

现在您的代码所说的是:

有一个type类型的树,可以与type类型的其他树进行比较。

你似乎想说的是:

有一棵树,由type类型的元素构建,与自己的类型相当。

在这种情况下,您应该像这样定义树:

public class Tree<T extends Comparable<T>> {
     private class TreeNode<F extends<Comparable<F>> implements Comparable<TreeNode<F>>{
           private F f;
           ...
           public F getF(){return this.f;}
           @Override
           public int compareTo(TreeNode<F> node){
               return this.f.compareTo(node.getF());
           }
     }
     //Use TreeNode<T> here
     ...
}

简短摘要:您有Tree类型T,这是一种可与T类型的其他对象进行比较的类型。树中的元素由TreeNode<T>表示,可以与其他TreeNode<T>进行比较。 TreeNode<T>TreeNode<T>的比较可以通过比较TreeNode内存储的元素来完成。有一个原因,为什么我在最后一点(至少按名称)偏离了原始设计。如果您将T视为存储项,则更容易考虑如何扩展树以支持TreeItem类型的项,这使您能够在树顶部构建关联数据结构。 / p>

编辑(直接回复,因为OP要求澄清):

OP的代码在回答时是这样的:

public class Tree<T> implements Comparable<Tree<T>>{
    ...
    TreeNode<???>{...}

}

考虑TreeNode有一个固定成员int key;一秒钟。您想要构建Tree:所以您需要TreeNode s,可以相互比较(即TreeNode implements Comparable<TreeNode>)来构建Tree。您将compareTo与int - 比较实现。您现在拥有非通用Tree

为了能够Tree通用,您需要通用TreeNode。因此,您需要TreeNode通用,并将int key;替换为以前固定的字段F f;。现在,您无法再根据int比较实现比较,因此TreeNode必须与TreeNode的其他实例进行比较。如果我们可以将其委托给F的比较函数,那将会很酷。为确保有效,类型必须为TreeNode<F extends Comparable<F>>。当然,我们仍然需要保持可比较TreeNode s的基本假设,以便最终得到

class TreeNode<F extends<Comparable<F>> implements Comparable<TreeNode<F>>

您现在拥有通用TreeNode<F>,可与TreeNode<F>的其他实例进行比较。

现在,您可以从这些节点构建通用Tree<T>,只要T可以与其他T进行比较,因此Tree<T extends Comparable<T>>。由于您不希望隐藏内部类的类型,因此可以区分T和F,并在树的函数中使用它们时实例化TreeNode<T>。从外面看不到F的存在。

答案 1 :(得分:1)

二叉树的一个要求是必须对节点值进行排序,因此您应该为TreeNode <T extends Comparable<T>>而不是<T>制作通用类型。然后,您的compareTo方法可以委托给节点compareTo