2017-04-25 65 views
0

所以我基本上将Person对象添加到一个BinarySearchTree,一个我自己写的类。我应该能够像BST那样做一些事情,比如找到一个人,返回它的孩子等等,而且我还必须为BST使用泛型类型。我还必须创建一个PersonNode类,其数据部分是Person类型的。我很困惑所有这些如何处理在一起。我写了这个至今:如何构建基于树/节点/泛型的程序?

我的BST类:

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

    public Node<T> root; 

    public BinarySearchTree() { 
     root = null; 
    } 

    public Node<T> find(T key) { 
     Node<T> current = root; 
     while (current.info != key) { 
      if (key.compareTo(current.info) < 0) 
       current = current.leftChild; 
      else 
       current = current.rightChild; 
      if (current == null) 
       return null; 
     } 
     return current; 
    } 
} 

我的通用节点类:

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

public T info; 
public T link; 
public Node<T> leftChild; 
public Node<T> rightChild; 

public void displayNode() { 
    System.out.print('{'); 
    System.out.print(info); 
    System.out.print(", "); 
    System.out.print(link); 
    System.out.print("} "); 
} 
} 

而且我PersonNode类,我很困惑,为什么这是必要的第一个地方,以及如何处理它:

public class PersonNode<Person> extends Node{ 

    public int iData; 
    public int dData; 
    public Node leftChild; 
    public Node rightChild; 

    public void displayNode() { 
     System.out.print('{'); 
     System.out.print(iData); 
     System.out.print(", "); 
     System.out.print(dData); 
     System.out.print("} "); 
    } 
} 

那么,我现在正在做这个权利? PersonNode有什么用?我还需要做什么?

+1

请修改该问题,将其限制为具有足够详细信息的特定问题以确定合适的答案。避免一次询问多个不同的问题。 –

回答

0

您可以采用不同构造一点点:

public class Node<T extends Comparable<T>>... 

public class BinarySearchTree<T extends Node>... 

public class Person implements Comparable<Person>... 

public class PersonNode extends Node<Person>... 
0

如果我得到这个权利,你试图写一个可以用类型参数BinarySearchTree数据结构的定义实现。首先,如果你打算在其他类似的功能类中使用它,我建议使Node类成为BinarySeachTree类或包的私有类。 Node类应该有一个类型为T的字段,它应该保存节点的值。另外PersonNode类从我的角度来看是无用的 - 我不知道iDatadData字段是什么 - 我猜测它们是可能转移到Person类的一些属性。

最后,虽然在内部你的树将存储在节点的信息,你真的想在树中存储的是简单的“对象可以以某种方式相比,”在这种情况下Person对象,所以不是编码BinarySearchTree<T extends Node>BinarySearchTree<T extends Comparable<T>>

所以基本上,假设你将重用Node类,结构可以是这样的:

public class Person implements Comparable<Person> { ... } 

public class Node<T extends Comparable<T>> { ... } 

public class BinarySearchTree<T extends Comparable<T>> { ... } 

然后在内部使用的Node型的BinarySearchTree存储信息:

public class BinarySearchTree<T extends Comparable<T>> { 
    private Node<T> root; 
} 

Node类本身

public class Node<T extends Comparable<T> { 
    private T value; 
    private Node<T> leftChild; 
    private Node<T> rightChild; 
} 

总论和友好的建议:不要使用公共字段,使用getter和setter你们班接入领域 - 去阅读有关数据隐藏和封装。长话短说,使用公共变量是一种非常糟糕的做法。使用有意义的字段名称iDatadData现在可能对您有一些意义,但是如果您在一年内回到代码中,则必须通读它才能了解它们在此情况下的真正含义。

顺便说一句,你不必明确地初始化提交引用为空,因为它们默认设置为null,如果没有另行说明。所以这可以省略,因为它是多余的。

public Node<T> root; 

    public BinarySearchTree() { 
     root = null; 
    } 

相反,我会考虑创建它接受T value作为树的根节点的初始值的构造函数。