2015-04-10 4 views
0

Моя реализация общего генеалогического дерева перестает добавлять узлы к дереву после добавления девятого узла в мой входной файл.Общее дерево останавливает добавление узлов в 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 
    } 
} 

Есть ли что-то я не хватает в рекурсивном дизайне? Существует ли более простой способ решения этой проблемы? Любой вклад в решение этой проблемы был бы чрезвычайно полезен.

+0

Как реализованы «TreeNode» и «Node»? – SubOptimal

+0

Как правило, «TreeNode» состоит из (Node ID и TreeNode parentNode) и имеет доступ к ArrayList своих дочерних узлов. «Node» - это объект, который содержит имя String и String parentName. @SubOptimal –

+0

Без знания ** вашего ** кода трудно найти ошибку. В чем разница между 'TreeNode.Node()' и 'TreeNode.getNode()'? Я предлагаю вам выполнить свой код с помощью отладчика и сравнить поток с вашей логикой. – SubOptimal

ответ

0

Проблема здесь заключалась не в добавлении узла к дереву, а в создании входного файла и обработки исключений. Любительская ошибка с моей стороны. При построении Tree объекты и Node не распознавали своих родителей, поскольку родительский элемент во входном файле будет указан как 112\s, а в другом месте во входном файле, указанном как 112 без пробелов. Это несоответствие во входном файле приводит к сбою в сборке дерева.

Смежные вопросы