微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

对有根树中的根节点求和节点值 初始树和节点值具有更新节点值的修改树尝试失败

如何解决对有根树中的根节点求和节点值 初始树和节点值具有更新节点值的修改树尝试失败

问题

我有一个有向根树,其中每个节点都有一些初始值。我希望每个节点的新值等于它及其后代的初始值之和。我将这个过程设想为从叶节点开始,然后将值沿树向上传播到根节点。

到过程结束时,根节点的值应该是所有节点的总和;每个其他节点相应地具有较小的值;每个叶节点都有它开始的值(因为没有子节点可以求和)。

在给定的图形上执行此过程的最佳/最优雅的方法是什么?

数据结构

只是为了澄清有向根树:它是有向无环图的限制形式,其中每个节点至多 1个父节点,并且有一个唯一指定的根节点没有家长。

在我的实现中,每个节点都有一个对其父节点的引用(根节点为空)和一个对其子节点的引用数组(叶节点为空)。

插图

初始树和节点值

enter image description here

具有更新节点值的修改

enter image description here

尝试失败

我的简单初始尝试从叶节点开始,对于每个向上遍历树,将运行总和添加到其父节点,直到到达分叉父节点——这样的节点被添加为候选节点在下一次迭代中。

这带来的问题是某些分叉节点可以不止一次地与它们自己的父节点相加,例如,如果从它自己的孩子到相关叶节点的路径有不同数量的进一步分叉节点。

List<Node> nodes = getLeaves();
HashSet<Node> nextNodes = new HashSet<>();

while (!nodes.isEmpty()) {

    for (Node node : nodes) {

        Node current = node;

        while (current.degree < 2) { // terminate when reach bifurcating parent node
            current.parent.value += current.value;
            current = current.parent;
        }

        if (current.parent != null) { // skip root node
            nextNodes.add(current.parent); // add bifurcating parent node for next iteration
        }

    }
    nodes = new ArrayList<Node>(nextNodes);
    nextNodes.clear();
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。