一棵树,层次不限,深度可以不一,只要设定好叶子节点的权重,得分,就可以一次求得每一个节点的得分,当然,每一个节点的权重也是要提前设定的:
/**
* 递归计算当前节点的得分=子节点的加权得分
* @param curr_folder_id
* @return
*/
public double calNodeScore(String curr_folder_id){
Dao dao = new DaoImp();
double gs = 0;//当前节点的加权结果,若当前节点包括叶子和非叶子节点
try{
String pfkSQL = "select folder_id,isleaf,weight,score from estimate_card where status=1 and par_folder_id="+curr_folder_id;
List ll = dao.getResultList(pfkSQL);
for(int ii = 0;ii<ll.size();ii++){//当前节点的子节点,包括可能的叶子节点和非叶子节点
String child_folder_id = (String)((Map)ll.get(ii)).get("FOLDER_ID");
String isleaf = (String)((Map)ll.get(ii)).get("ISLEAF");
String weight = (String)((Map)ll.get(ii)).get("WEIGHT");
if("0".equals(isleaf)){
//当前节点的非叶子子节点的计算结果
double ret = calNodeScore(child_folder_id);
//还要和兄弟节点的结果进行加权
gs += (ret*Double.valueOf(weight));
}else{
//当前节点的叶子子节点
double s = Double.valueOf((String)((Map)ll.get(ii)).get("SCORE"));
double w = Double.valueOf((String)((Map)ll.get(ii)).get("WEIGHT"));
gs += s*w;
}
}
//更新当前节点的加权得分
String update = "update estimate_card set score="+gs+" where folder_id="+curr_folder_id;
dao.update(update);
}catch(Exception e){
e.printStackTrace();
}finally{
dao.closeconn();
}
return gs;
}
另外,算法很需要实际业务模型的理解,还有参考,还需要实际的大概逻辑