我正在使用键值节点生成二叉树。
它的工作原理如下:
订购如下: 如果你实现一个新节点,你给出一个键和一个值(不重要),它将检查是否已经有一个节点,如果没有,它将创建它作为第一个节点。现在它检查密钥是否小于第一个节点的密钥,如果是,如果没有密钥则将其作为左节点,如果有,它将迭代到那个并再次检查它。对于更大的键/右节点也是如此。如果密钥等于当前节点的密钥,它将覆盖节点。
如果我使用类似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
}
}
答案 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
。