2014-05-18 114 views
3

我有一個很好的Java中的二叉樹。但我想增強節點中的數據內容。可比用於二叉樹結構

for(int i = 1; i <=10; i++) 
    t.insert(new Integer(i)); 

這將增加的項目是這樣的::

public void insert(Comparable item) { 
    current = parent = grand = header; 
    nullNode.element = item; 
    ... 
} 

這裏是樹的格式:

private static class RedBlackNode { 
    // Constructors 
    RedBlackNode(Comparable theElement) { 
     this(theElement, null, null); 
    } 

    RedBlackNode(Comparable theElement, RedBlackNode lt, RedBlackNode rt) { 
     element = theElement; 
     left  = lt; 
     right = rt; 
     color = RedBlackTree.BLACK; 
    } 

    Comparable element; // The data in the node 
    RedBlackNode left;  // Left child 
    RedBlackNode right;  // Right child 
    int   color;  // Color 
} 

對於顯示目前我可以在上面做諸如添加值樹,我這樣做:

private void printTree(RedBlackNode t) { 
    if(t != nullNode) { 
     printTree(t.left); 
     System.out.println(t.element); 
     printTree(t.right); 
    } 
} 

雖然在許多其他語言編程時,元素將被聲明爲struct,對於此sample code在Java中它聲明爲Comparable,並且當前僅將一個元素作爲整數。我的問題是,我該如何使用它類似於一個結構,以便能夠同時操縱它,例如在這個僞代碼做:

System.out.println(t.element.valueInt); 
System.out.println(t.element.firstNameString); 
System.out.println(t.element.lastNameString); 

我都基於一些以前posts嘗試不同的語法組合,但目前還沒有工作。

對於當前的代碼版本添加評論,請檢查Gist

所有建議深表感謝。

+1

我想你會需要實現Comparable接口並重寫compareTo()方法。 – gyanu

回答

4

Comparable是一個接口。任何類都可以實現它。由於樹的節點唯一需要知道的是如何比較,並且因爲Comparable正好提供了這種知識,所以對樹使用Comparable就足夠了。

但是,這對您而言可能還不夠,因爲您可能想知道其他屬性是您實施的一部分。出於這個原因,你可以選擇讓你的RedBlackNode通用的確切類型進入節點的項目,前提是它實現Comparable

public class RedBlackTree <T extends Comparable<? super T>> { 
    private static class RedBlackNode { 
     ... 
     T element; 
    } 
} 

你的代碼的其餘部分保持不變。對於暴露Comparable的樹的方法(例如用於獲取節點信息的樹),請改爲使用通用類型T

RedBlackTree<MyClass> tree = new RedBlackTree<MyClass>(); 

當然,MyClass必須實現Comparable

在創建時RedBlackTree,這樣需要提供節點的類型。改變的總體效果是,當你的代碼從樹中獲取一個元素時,它是強類型的,允許你在沒有轉換的情況下訪問它的方法和字段。