如何确定图表的树?

时间:2017-08-22 09:09:20

标签: python algorithm graph tree

给定具有属性Node的对象parent

class Node(object):
    def __init__(self, parent=None):
        self.parent = parent

我正在尝试进行以下测试:

import pytest

@pytest.fixture
def _nodes():
    return {1: Node(),
            2: Node(parent=5),
            3: Node(),
            4: Node(parent=3),
            5: Node(parent=1),
            6: Node(),
            7: Node(parent=6),
            8: Node()
            }

def test_trees(_nodes):
    assert trees(_nodes) == [{1, 2, 5}, {3, 4}, {6, 7}, {8}]


if __name__ == "__main__":
    pytest.main([__file__])

到目前为止,我已经提出了trees方法的以下实现:

def trees(nodes):
    _trees = []
    while nodes:
        for u, node in nodes.items():
            if node.parent is None:
                _trees.append({u})
                nodes.pop(u)
            else:
                for tree in _trees:
                    if node.parent in tree:
                        tree.add(u)
                        nodes.pop(u)
    return _trees

但是,此实现“删除了输入”,而在我的“真实”应用程序中的相关问题中,我得到了RuntimeError字典mutated during iteration

有没有更好的方法来实现trees方法?

1 个答案:

答案 0 :(得分:0)

我意识到有一种更好的方法来实现我正在尝试做的事情,即确定图形的强连接组件。除了parent属性之外,每个节点还具有在“深度优先搜索”期间发现和完成它的“间隔”(即,其邻接列表被完全探索)。该算法使得孩子的间隔完全被父母的间隔所包含。

Sedgewick和Wayne, Algorithms (第4版)也解释了这一点,如下所示。

enter image description here