最近在做公司项目的时候,遇到了这样的一个需求,本人将需求进行了简化:已知一个树形结构的list,并且已知根节点的id和value以及每一个节点的rate和pid,要求算出每一个节点的value,前提是不知道树结构总共有几级节点。
这里显然需要用到递归算法了,何谓递归算法,递归算法就是函数自己调用自己的算法,为什么要用递归算法,因为树结构不明确,在不知道树结构有几级或者已知树结构大于等于三级的情况下,本人推荐优先使用递归算法,递归算法节省程序代码量,优化了代码的设计,缺点是设计起来较为复杂,对逻辑思维要求较高,而且会占用额外的栈空间。
代码如下:
public void saveorupdate(List<Tree> trees,String fjd,Double sum){
for(Tree tree:trees){
if(tree.getPid().equals(fjd)){
tree.setZl(sum*tree.getRate());
saveorupdate(trees,tree.getId(),tree.getZl());
}
}
}
如代码所示,定义saveorupdate方法的时候,在方法内部也调用了该方法本身,只不过在方法内部要加上条件判断,并且在调用方法的时候,修改了传入参数。
这里的条件判断,是为了收束树结构的发散,如果没有条件限制,会出现死循环的现象,而修改传入参数信息,则是为了计算之后叶子节点的信息。
如此首次传入的fjd值为根节点的id,此后一旦遍历到一级叶子节点的时候,就会将求出值赋给该叶子,同时以该叶子为根继续调用该方法,直到该叶子下所有的节点统统计算完毕,再继续执行第二个一级节点的计算,直到计算出所有的节点信息。
相信一定会有更好的解决办法或者更高效简洁的递归算法,初入职场,一边工作一边继续学习,将工作中学到的东西记录下来,方便以后的查阅,有不正确的地方,也欢迎大家提出指正,相互学习。