如何计算给定多个父节点的后代?

时间:2019-06-30 21:45:44

标签: python data-structures tree

因此,给定一些如下数据,其中该功能代表[id, name,age,parent 1 id,parent 2 id]

[[0,'john',12,3,4],[1,'rachel',25,3,4],[2,'carol',10,1,5], [3, 'maggie',40,,], [4,'peter',50,,],[5,'mike',30,,]

我将如何查找彼得拥有的后代数量?所以应该是3,因为雷切尔,约翰和卡罗尔是后代。

在python中解决此问题的最佳方法是什么。我当时在想树数据结构,但对于如何实现它感到困惑。

我的方法是按如下方式使用哈希图:

hmap = {}
for i in range(1,len(data)):
    for j in range(1,len(data)):
        if data[i][0] == data[j][3] or data[i][0] == data[j][4]:
            if data[i][1] in hmap:
                hmap[data[i][1]] +=1
            else:
                hmap[data[i][1]] =1
            print(data[i][1], data[j][1])

但这只会给孩子们带来帮助。然后,我需要添加孩子的孩子。

任何指导将不胜感激。

1 个答案:

答案 0 :(得分:1)

理想情况下,我建议使用单独的SQL表,将is_checked作为布尔值,并进行长时间的迭代。 不过,您可以尝试使用双重list结构,即list_id_to_check和list_id_checked:

def find_descendants(parent_id, persons):
    list_id_to_check = [parent_id]
    list_id_checked = []
    list_descendant_ids = []
    while True:
        if not list_id_to_check:
            break
        for id_to_check in list_id_to_check:
            for person in persons: 
                if id_to_check in person[-2:]:
                    if person[0] not in list_descendant_ids:
                        list_descendant_ids.append(person[0])
                    if person[0] not in list_id_checked and person[0] not in list_id_to_check:
                        list_id_to_check.append(person[0])
            list_id_to_check.remove(id_to_check)
            list_id_checked.append(id_to_check)
            continue
    return list_descendant_ids