在添加输入文件中的第九个节点后,我对通用族树的实现会停止向树中添加节点。
输入看起来像这样:
[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
然后在Tree类中我们有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 :(得分:0)
这里的问题不是向树添加节点,而是使用输入文件和异常处理。我的业余错误。在构建Tree
时,TreeNode
和Node
对象无法识别其父级,因为输入文件中的父级将列为112\s
而不是其他位置在输入文件中列为112
,没有任何空格。输入文件中的这种差异是导致组装树时出现故障的原因。