2017-04-04 35 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; 
    } 
}