Моя реализация общего генеалогического дерева перестает добавлять узлы к дереву после добавления девятого узла в мой входной файл.Общее дерево останавливает добавление узлов в java
Входы выглядеть следующим образом:
[0] ,111
[1] 111,113
[2] 111,112
[3] 112,PstDC3000
[4] 112,Pae1
[5] 113,219
[6] 113,114
[7] 114,116
[8] 114,115
[9] 115,GLGR
[10] 115,Baq35567
[11] 116,117
...
[219] 219,VchN16961
Далее следуют фрагменты кода, которые относятся к строительству этого дерева в Java:
В основной код строит дерево с входом отсканированного в от текстовый файл:
while(scn.hasNextLine())
{
String[] lineData = scn.nextLine().split(regex); //input from file
Node ID1 = new Node(lineData[1], lineData[0]);
//1 is child ID, 0 is parent ID
if(lineData[0].isEmpty()) //the root
{
tree.addNode(ID1, null);
}//end if
tree.addNode(ID1,lineData[0]);
}//end while
scn.close();
}//end try
затем в классе дерева мы имеем метод AddNode вызывая метод addNewChild который является рекурсивным методом, это где я подозреваю, что что-то происходит сонату нг:
public boolean addNode(Node ID, String parentName)
{
//When the root and parentName are both null, return true.
//Do not throw an IllegalArgumentException for this circumstance only.
if(parentName == null && root == null)
{
root = new TreeNode<Node>(ID, null);
return true;
}
//When the parentName of the node being added refers to the root
//as its parent.
if(parentName.equals(root.Node().getName()))
{
TreeNode<Node> childTreeNode =
new TreeNode<Node>(ID, root);
root.addChild(childTreeNode);
return true;
}
//if the family tree already has this TreeNode, don't do anything
//and return false
if(contains(ID.getName()))
{
return false;
}
//If there is no such parent, return false
if(contains(parentName) == false)
{
return false;
}
//otherwise add the TreeNode and return true.
addNewChild(root, parentName, ID);
return true;
}
рекурсивный метод addNewChild:
private void addNewChild(TreeNode<Node> name,
String parentName, Node p)
{
//if the parent node doesn't have any children.
if(name.getChildren() == null)
return; //base case
//if the parent node's name matches the parent name of the child node
if(name.getNode().getName().equals(parentName))
{
name.addChild(new TreeNode<Node>(p, name));
return; //base case
}
//iterate thru parent's getChildren list
Iterator<TreeNode<Node>> itr = name.getChildren().iterator();
while(itr.hasNext())
{
addNewChild(itr.next(), parentName, p); //recursive case
}
}
Есть ли что-то я не хватает в рекурсивном дизайне? Существует ли более простой способ решения этой проблемы? Любой вклад в решение этой проблемы был бы чрезвычайно полезен.
Как реализованы «TreeNode» и «Node»? – SubOptimal
Как правило, «TreeNode» состоит из (Node ID и TreeNode parentNode) и имеет доступ к ArrayList своих дочерних узлов. «Node» - это объект, который содержит имя String и String parentName. @SubOptimal –
Без знания ** вашего ** кода трудно найти ошибку. В чем разница между 'TreeNode.Node()' и 'TreeNode.getNode()'? Я предлагаю вам выполнить свой код с помощью отладчика и сравнить поток с вашей логикой. – SubOptimal