如何解决树状结构中的级联值
我有一个n元树结构,该结构具有可以引用树中任何节点的功能。这意味着引用节点将从引用的节点中获取其值。
Rule number 1: The value of a node is computed from its children
通过使您设置参考节点并将其值复制到树中的首选位置,参考节点可以使您免于创建已经在树中创建的结构。由于您刚刚在此树中的某个位置插入了一个值,因此现在必须向上层叠该值,因为必须满足规则1。
Rule number 2: Child nodes which are used to compute value of a parent node are always leaf nodes.
Rule number 3: Cyclic references are not allowed.
Rule number 4: Root node cannot be referenced.
树节点具有一个添加的值,即其父节点的值。例如如果两个子节点的值为10,则其父节点的值为20。
由于在不考虑参考节点的情况下初始化了树,因此应该通过新方法找到参考节点。
问题是找到参考节点后,其值应级联直至树的根。
如何实现此行为?我可以在当前树中找到一个参考节点,但是向上层叠是一个问题。
视觉示例:
public class TreeNode {
private Long id;
private TreeNode parent;
private List<TreeNode> children = new ArrayList<TreeNode>();
private TreeNode referenceNode;
private BigDecimal value = BigDecimal.ZERO;
}
public class TreeNodeService {
public List<TreeNode> getTreeNodes() {
List<TreeNode> treeData = new ArrayList<TreeNode>(); // assume treeData is filled by database call
if (treeData.size() > 0) {
findReferenceNode(treeData,treeData);
}
return treeData;
}
private void findReferenceNode(List<TreeNode> allNodes,List<TreeNode> currentNodeHolder) {
if (currentNodeHolder.size() > 0) {
TreeNode currentNode = currentNodeHolder.get(0);
for (TreeNode childNode : currentNode.getChildren()) {
if (childNode.getReferenceNode() != null) {
setReferenceNodeValue(childNode.getReferenceNode().getId(),allNodes,childNode,currentNode);
}
findReferenceNode(allNodes,Arrays.asList(childNode));
}
}
}
private void setReferenceNodeValue(Long referenceId,List<TreeNode> allNodes,TreeNode childNode,TreeNode parentNode) {
if (allNodes.size() > 0 && referenceId != null) {
TreeNode rootNode = allNodes.get(0);
for (TreeNode innerChild : rootNode.getChildren()) {
// If there is a match,then innerChild is our original node which
// is being referenced by childNode
if (innerChild.getId().equals(referenceId)) {
// Copy original node value and set reference node value with it
childNode.setValue(innerChild.getValue());
// Parent of this reference node might have a non-zero value already set
BigDecimal startValue = parentNode.getValue();
updateParentNodeValue(parentNode,startValue,childNode.getValue());
} else {
setReferenceNodeValue(referenceId,Arrays.asList(innerChild),parentNode);
}
}
}
}
private void updateParentNodeValue(TreeNode parentNode,BigDecimal startValue,BigDecimal valueToAdd) {
BigDecimal finalValue = startValue.add(valueToAdd);
parentNode.setValue(finalValue);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。