如何以树数据结构将数据传递给其子级

时间:2019-06-26 11:45:52

标签: javascript arrays multidimensional-array tree tree-traversal

如何遍历此树数据结构,将值传递给javascript中的子级。百分比用于将值传递拆分为“ N”和“ Y”

例如enter image description here

1 个答案:

答案 0 :(得分:0)

在不知道您的数据结构的情况下,我将提出一个使用Node类的属性,该类具有以下属性:

  • 一个分数(0到1之间的百分比)
  • 两个子节点引用(一个表示“否”,一个表示“是”),以及
  • 一个首先为0的值,但是一旦完成计算就可以确定。

该算法将是一种递归算法,您可以从根开始并向其输入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));
}

一些评论

尽管此问题讨论的是树的数据结构,并用treetree-traversal标记,但输入图不是树,而是DAG

在评论中提到,百分比值用于分割要进入 next 圆的值,但是在图中,百分比被应用于节点自身:百分比为30%的叶子的值为276,但是图像显示该节点的值已应用了30%。