2011-06-21 24 views
0

在這個複合樹中,我保留了用於靈活樹遍歷的父節點的引用。我不想一直檢查父對象是否爲空引用,但是如果我創建一個NullNode類並初始化每個節點的父對象,我會得到一個堆棧溢出,因爲NullNode有一個NullNode有一個NullNode有一個.. .. ad infinitum 我試着將NullNode的父項設置爲null,但是我仍然必須爲父項執行空引用檢查,這似乎是擊敗了目的。 有誰遇到過這個?什麼,如果有什麼可以做的?null模式和複合模式在一起玩並不好

謝謝!

+0

你的遍歷函數是如何工作的?你需要停下來?你需要發佈一些代碼,因爲你的問題似乎並不合適。 – Nix

+0

我甚至從來沒有足夠多的搜索樹。堆棧溢出發生在NullNode的構造過程中,因爲它包含一個初始化爲NullNode的父代。 – krakencalamari

+0

NullNode當然應該沒有父母。使用僞代碼查看下面的第二個答案。 –

回答

1

,如果我做一個NullNode類和每個節點的父節點初始化到這一點,我得到一個堆棧溢出,因爲NullNode有NullNode有一個NullNode有.... ad infinitum我試着將NullNode的父項設置爲null,但是我仍然必須爲父項執行空引用檢查,這似乎違背了目的。任何人遇到這個?

您的NullNode不需要實際包含另一個NullNode作爲父母。只需執行getParent()NullNode(或任何你稱之爲)返回thisself或任何意味着你的語言。

但是,這可能仍然是一個壞主意,因爲你必須在某個點停止遍歷。上面的代碼讓你瞭解了構造函數的遞歸過程,但是沒有樹的根,因爲它一直是NullNodes或者烏龜或者類似的東西。

如果你真的顯示代碼,即使它沒有工作,並且稍微描述一下你的使用計劃,這將會更容易討論。

1

反例(極端的僞代碼):

class NullNode(): Component{ 
    public NullNode(){ 

    } 
    public something SearchUp(){ 
     return null; 
    } 
} 

class Node: Component{ 
    public Node(t){ 
     this.parent = NullNode(); 
    } 
    public void SetParent(Component parent){ 
     this.parent = parent; 
    } 
    public something SearchUp(){ 
     return self.parent.SearchUp(); 
    } 
    } 

abstract class Component{ 
    Component parent 

    public Component(){ 
    } 
    public something SearchUp(); 
}