2017-04-25 21 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作爲樹的根節點的初始值的構造函數。