General Tree停止在java中添加节点

时间:2015-04-10 05:17:09

标签: java recursion tree

在添加输入文件中的第九个节点后,我对通用族树的实现会停止向树中添加节点。

输入看起来像这样:

[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
    }
}

我的递归设计中是否缺少某些东西?有没有更简单的方法来解决这个问题?关于如何解决这个问题的任何意见都将非常有帮助。

1 个答案:

答案 0 :(得分:0)

这里的问题不是向树添加节点,而是使用输入文件和异常处理。我的业余错误。在构建Tree时,TreeNodeNode对象无法识别其父级,因为输入文件中的父级将列为112\s而不是其他位置在输入文件中列为112,没有任何空格。输入文件中的这种差异是导致组装树时出现故障的原因。