遍历树收集所有子节点,不包括不相关的分支

Posted

技术标签:

【中文标题】遍历树收集所有子节点,不包括不相关的分支【英文标题】:Traverse tree to collect all children nodes, excluding unrelated branches 【发布时间】:2021-12-18 16:26:47 【问题描述】:

我有一个子父元组列表。我想遍历树来收集输入节点的所有子节点。

in_list = [(2,1),(3,2),(4,3),(6,5),(7,4),(8,4)]

现在说我想收集节点 2 的所有子节点。那就是

out_list = [3,4,7,8]

此问题或其解决方案是否有任何特定名称?只需要知道去哪里找。

【问题讨论】:

【参考方案1】:

您可以使用递归生成器函数:

in_list = [(2,1),(3,2),(4,3),(6,5),(7,4),(8,4)]
def paths(n, c = []):
   if not (t:=[a for a, b in in_list if b == n]):
      yield from (c + [n])
   else:
      yield from [j for k in t for j in paths(k, c+[n])]

print([*set(paths(2))][1:])

输出:

[3, 4, 7, 8]

【讨论】:

【参考方案2】:

你需要像DFS一样遍历in_list中的这些节点,你可以试试这个:

def DFS(path, lst, father):
    for (a,b) in lst:
        if b == father:
            path.append(a)
            DFS(path, lst, a)
    return path

in_list = [(2,1),(3,2),(4,3),(6,5),(7,4),(8,4)]
res = DFS([], in_list , 2)
print(res)

输出:

[3, 4, 7, 8]

【讨论】:

以上是关于遍历树收集所有子节点,不包括不相关的分支的主要内容,如果未能解决你的问题,请参考以下文章

js逆向树操作 - 收集所有节点的父节点 (包括顶级根节点) - 递归

js逆向树操作 - 收集所有节点的父节点 (包括顶级根节点) - 递归

js逆向树操作 - 收集所有节点的父节点 (包括顶级根节点) - 递归

二叉查找树详解

二叉查找树详解

节点树和元素树--深度遍历