У меня есть дерево:реализация Дерево бросает StackOverflowError
public class Node<T> {
private T data;
private Node<T> parent;
private Map<T, Node<T>> children;
public Node(T data, Node<T> parent) {
this.data = data;
this.parent = parent;
}
public Node(T data) {
this.data = data;
}
public boolean hasChildren() {
if (this.children != null) {
return this.children.size() > 0;
}
return false;
}
public void setParent(Node<T> parent) {
parent.addChild(this);
this.parent = parent;
}
public void addChild(T data) {
Node<T> child = new Node<T>(data);
child.setParent(this);
this.children.put(child.data, child);
}
public void addChild(Node<T> child) {
child.setParent(this);
this.children.put(child.data, child);
}
}
Затем я пытаюсь заполнить это следующим образом:
Node<String> parentNode = new Node<String>("Parent");
Node<String> childNode = new Node<String>("Child");
childNode.setParent(parentNode);
Это бросает StackOverflowError
, потому что мы застряли в SetParent петли - addChild.
Я попробовал другой путь:
Node<String> parentNode = new Node<String>("Parent");
Node<String> childNode = new Node<String>("Child", parentNode);
Однако childNode.parent.children
имеет нулевое значение, и я хотел бы, чтобы иметь childNode
в нем.
Как я могу это достичь?
Где в 'Node (T, Node)' конструктора вы думаете, вы добавляете новый ребенок к карте родителя детей? (В общем, непонятно, что вы пытаетесь задать в этом вопросе ... почему новый код не работает или о переполнении стека?) –
@Jon Skeet: отредактирован, лучше? – l0r3nz4cc10
Не совсем так, потому что все еще неясно, пытаетесь ли вы исправить этот второй конструктор или устраните тот факт, что 'childNode.setParent (parentNode)' терпит неудачу. –