2013-07-08 77 views
1

我正在嘗試爲二叉樹實現構建一個節點類。這裏是Node類的頭文件:C++中的BinaryTree節點類

class Node { 
public: 
    Node(); 
    Node(int value); 
    void setParent(Node& parent); 
    void setLeftChild(Node& child); 
    void setRightChild(Node& child); 
    void setValue(int value); 
    void setIndex(int index); 
    void setHeight(int height); 
private: 
    int value; 
    Node& parent; 
    Node& leftChild; 
    Node& rightChild; 
    int height; 
    int index; 
}; 

現在,我想寫上面聲明的構造函數Node(int value)。 我應該如何初始化leftChild,rightChild,父領域?他們也是節點,所以我想調用它們的默認構造函數,但它似乎不工作。 節點::節點(int值):值(值),父(),leftChild(),rightChild(){}

編譯器被認爲 「參考輸入 '節點' 需要一個初始值設定」

謝謝。

+0

引用需要引用一個對象。所以你需要一個對象供他們參考。 – juanchopanza

+0

引用需要綁定到已經存在的對象。 – Pixelchemist

+0

所有這些設置者都沒有意義(即使他們是可能的,但你永遠不能設置引用),只要直接將數據成員公開就可以了。或者(更好),使樹的建立方法成爲朋友...另外,如果孩子是彼此的鄰居,那麼只有一個指向第一個孩子的指針就足夠了,右邊的孩子就在它旁邊('child [0 ]','小孩[1]') – Walter

回答

0

您應該使用指定節點父級的構造函數: Node(Node * parent,int value); 當您創建根節點時,只需使用NULL作爲參數調用此構造器即可。 所有對父母和孩子的引用都應該是指針。

+0

是的,指針! Java使我習慣於在C++中引用,對應的是指針。謝謝! – Ra1nWarden

0

你可以更好地使用指針(Node*)而不是引用(Node&)。在構造函數中,只需將它們分配給nullptr即可。

引用是必要的引用一些對象(顯然,當你沒有左或右的孩子,你不能引用它們)。所以指針來幫助你 - 他們允許指向無 - 在這種情況下nullptr被用作沒有。

0

在這種情況下,將指針指向引用並將它們初始化爲NULL是有意義的。通過這樣做,您還可以通過檢查NULL指針來檢查節點是否有子節點或父節點(即不是根節點)。另外,一定要添加一個析構函數來釋放內存。