用于具有n-ary树节点的循环递归

时间:2011-11-23 17:06:07

标签: java function recursion tree

递归函数调用在达到限制后突然停止。

当从main调用该函数时,首先传递根节点,并在循环中检查根节点的子节点的大小值,并递归地在该子节点上调用相同的函数来设置其大小值。 / p>

我的输入是非常大的树。当我在设置树中元素的大小之前打印n-ary树时,列表将打印出所有元素。但是,在setsize()递归期间,执行在某个特定点上无意义地挂起。每次执行都停在同一个元素上。如果我在创建n-ary树时从我的输入中挂起的元素之后删除元素,则执行成功并且不会挂起。

我尝试增加-Xss -Xmx -Xss。仍然没用。

我是否必须使用线程或请让我知道我的下面的递归方法中的任何问题,以解释上面的函数实现。 THX !!

public void setsize(Element inEle){
        for(int i =0;i<inEle.children.size();i++){
            if(inEle.children.get(i).size==0)
            {                   
                this.setsize(inEle.children.get(i));
                i--;
            }else
            {
                if(!inEle.children.get(i).isRedefine)
                    inEle.size=inEle.size+inEle.children.get(i).size;                   
            }
        }
        inEle.size=inEle.size*inEle.occurs;
    }

2 个答案:

答案 0 :(得分:0)

我认为在相同条件下i++i--出错了。

注意:递归调用保存本地变量的状态,所以不要自己尝试。

答案 1 :(得分:0)

从这一行判断,inEle.size=inEle.size+inEle.children.get(i).size;看起来Element的大小是它下面的大小的总和。我看到的问题是它从来没有任何地方可以开始。所以,我们假设它正在计算节点,然后您可以将实际计算更改为您想要的任何值。

我要做的第一件事是更改setSize方法也返回大小以及设置。如下

public int setSize(Element parent) {
    int size = 0;
    for(Element child : parent.children()) { // enhanced for loop
        size += setSize(child);
    }
    parent.size = size + 1; // the +1 is the current node
    return size;
}

然后你可以在root上调用它:

int treeSize = setSize(root);