答案 0 :(得分:0)
在不知道您的数据结构的情况下,我将提出一个使用Node类的属性,该类具有以下属性:
该算法将是一种递归算法,您可以从根开始并向其输入1000。该节点将小数应用于该值(即乘),并将结果添加到其自己的值。然后,将该值递归输入到“是”子代(如果有),剩余值递归输入到“否”子代。
将值添加到节点的现有值很重要,因为某些节点可能会从多个“父级”获得输入,如示例图右侧所示。这些多个输入应加起来。
这是JavaScript代码:
class Node {
constructor(fraction) {
this.fraction = fraction; // number between 0 and 1
this.no = null; // child node for edge with label "N"
this.yes = null; // child node for edge with label "Y"
this.value = 0; // This will get a value later, as input is cascaded through the graph
}
setChildren(no, yes) {
this.no = no;
this.yes = yes;
}
addInput(value) {
const addedValue = value * this.fraction;
this.value += addedValue;
if (value) { // dripple down the value through the outward edges
if (this.no) this.no.addInput(value - addedValue);
if (this.yes) this.yes.addInput(addedValue);
}
}
}
// Create vertices with their percentages (fractions)
const nodes = [
new Node(1),
new Node(0.5),
new Node(0.8),
new Node(1),
new Node(0.13),
new Node(0.5),
new Node(1),
new Node(0.3)
];
// Create edges
nodes[0].setChildren(null, nodes[1]);
nodes[1].setChildren(nodes[2], nodes[5]);
nodes[2].setChildren(nodes[3], nodes[4]);
nodes[4].setChildren(null, nodes[5]);
nodes[5].setChildren(nodes[6], nodes[7]);
// Send a value of 1000 to the root node
nodes[0].addInput(1000);
// Show the value of each node after this action
console.log("node value");
for (const node of nodes) {
console.log((node.fraction*100 + "%").padStart(4), node.value.toFixed(1).padStart(6));
}
尽管此问题讨论的是树的数据结构,并用tree
和tree-traversal
标记,但输入图不是树,而是DAG。
在评论中提到,百分比值用于分割要进入 next 圆的值,但是在图中,百分比被应用于节点自身:百分比为30%的叶子的值为276,但是图像显示该节点的值已应用了30%。