如何对自引用父子结构产品列表子值求和并填充父节点空值
实现方案
你之前只存储了HashMap没拿到正确结果,大概率是采用了从上到下的计算顺序,父节点计算时子节点的最终值还没确定,所以求和结果不对。这个场景必须从最底层的叶子节点向上计算,具体步骤如下:
- 第一步:预处理数据构建映射与树形关系
- 把所有产品实体存入
HashMap<String, Product>,key 为产品 Name 字段,方便快速查找父节点 - 给每个产品实体新增
children字段用来存储直属子节点,遍历所有产品:如果产品的 Parent 不为 null,就把当前产品加入对应父节点的children列表中
- 把所有产品实体存入
- 第二步:递归计算节点值
写一个递归函数实现自底向上的计算,逻辑如下(以Java为例,其他语言逻辑一致):// 入参为当前产品节点,返回当前节点的最终Value值 int calculateNodeValue(Product node) { // 节点本身有明确值直接返回 if (node.Value != null) { return node.Value; } int total = 0; // 递归累加所有子节点的返回值 for (Product child : node.children) { total += calculateNodeValue(child); } // 把计算结果赋值给当前节点的Value字段 node.Value = total; return total; } - 第三步:触发全量计算
遍历所有 Parent 为 null 的根节点,依次调用calculateNodeValue方法即可完成所有节点的数值计算。
注意事项
如果你的业务场景可能出现产品循环引用(比如A的父节点是B,B的父节点是A),需要在递归时增加节点访问标记,避免出现死循环。正常合法的树形产品结构不需要额外处理。
内容的提问来源于stack exchange,提问作者Blake Rivell
相关产品推荐
相关产品推荐

