2017-04-04 41 views
0

在我的節點類中爲樹數據結構獲取一個Stackoverflow錯誤。我知道原因,但我似乎無法解決它。二叉樹的節點類。獲取stackoverflow錯誤

public class Node { 
    Node right; 
    Node left; 
    String element; 
    Node parent; 

    public Node(){ 
     right = new Node(); 
     left = new Node(); 
    } 
} 

因爲我在構造函數中構造新的節點,我得到了堆棧溢出。我如何構造我的構造函數並避免這個錯誤?

+1

嗯,不這樣做?當你說'節點node = new Node();'時,你想要'left'和'right'的值是什麼? –

+0

我看到你困惑的地方。只要左右兩邊爲空即可。稍後當你決定爲你的樹添加一個節點時,你可以初始化那些值爲'new Node()':) – Spidey

回答

3

您可以在實際存在時按需創建節點。

public class Node { 
    Node left, right; // created as required 
    String element; 
    Node parent; 

    public Node(Node parent, String element) { 
     this.parent = parent; 
     this.element = element; // if you don't have an element you don't need a Node. 
    } 
} 

注:可能是因爲你不需要parent領域,大多數實現不使用它。

public class Node { 
    Node left, right; // created as required 
    String element; 

    public Node(String element) { 
     this.element = element; // if you don't have an element you don't need a Node. 
    } 

    public void setLeft(Node left) { this.left = left; } 
    public void setRight(Node right) { this.right = right; } 
} 

例如,

Node d = new Node("d"); 
d.setLeft(new Node("a")); 
d.setRight(new Node("z")); 
+0

我只是好奇。你說父領域沒有實現很多。如果一個節點是用外部父節點實現的,你如何確定一個節點是否有父節點?另外你如何確定根節點? – Sedrick

+0

@SedrickJefferson通常你從樹的根開始,而不是在它內部的一個隨機節點。從根開始,你知道它下面的每個節點都有一個父節點,它的父節點是什麼。 –

+0

不幸的是,當我正在學習編程時,我沒有在數據結構類中多加關注,而且我從未回過頭去掌握這些概念。我想我現在明白了。這是一個簡單的節點,可用於實現簡單鏈接列表,雙向鏈接列表或循環鏈接列表等其他創意。 – Sedrick

1

您應該按如下方式刪除遞歸構造函數調用。

public Node(){ 
     right = null; 
     left = null; 
    } 

特定樹的組裝應該通過從類的外部或通過getter和setter函數分配兒童來完成。

1

不要new Node本身在其構造,它永遠不會結束,直到計算器或堆出來的內存,你可以這樣做:

  • leftright構造器:

代碼:

public class Node { 
    Node right; 
    Node left; 
    String element; 
    Node parent; 

    public Node(Node left, Node right){ 
     this.left = left; 
     this.right = right; 
    } 
} 
  • 隨着setter

代碼:

public class Node { 
    Node right; 
    Node left; 
    String element; 
    Node parent; 

    public Node(){ 
    } 

    public void setLeft(Node left) { 
     this.left = left; 
    } 


    public void setRight(Node right) { 
     this.right = right; 
    } 
}