如何将父子节点列表转换为指定的嵌套树形结构?
问题描述
现有节点关系列表:
lines = [[0,1],[0,2],[0,3],[1,4],[2,5],[2,6],[3,7],[3,8],[3,9]]
其中每个元素格式为[父节点, 子节点],根节点固定为0,节点层级关系为:
- 0的子节点是1、2、3
- 1的子节点是4
- 2的子节点是5、6
- 3的子节点是7、8、9
期望生成嵌套结构:
[0, [1, [4]], [2, [5], [6]], [3, [7], [8], [9]]]
但运行以下代码后,输出为[[0], [1, [4]], [2, [5, 6]], [3, [7, 8, 9]]],不符合预期:
lines = [[0,1],[0,2],[0,3],[1,4],[2,5],[2,6],[3,7],[3,8],[3,9]] result = [] node_n = [] for i in lines: node = list() for j in lines: if i[0] == j[0]: node.append(j[1]) # print(node) node_list = [i[0],node] if node_list not in result: result.append(node_list) result.sort() del result[0][1] print(result)
修复方案
原代码仅简单收集了每个节点的直接子节点,未递归处理子节点的后代,且结构组织逻辑有误。通过递归方式可以正确构建目标嵌套结构,具体实现如下:
lines = [[0,1],[0,2],[0,3],[1,4],[2,5],[2,6],[3,7],[3,8],[3,9]] # 构建节点-子节点映射字典,方便快速查询 node_map = {} for parent, child in lines: if parent not in node_map: node_map[parent] = [] node_map[parent].append(child) # 递归生成嵌套树形结构 def build_tree(node): # 无后代节点时,直接返回[节点值] if node not in node_map: return [node] # 初始化当前节点的结构,再逐个添加子节点的嵌套结构 tree = [node] for child in node_map[node]: tree.append(build_tree(child)) return tree # 从根节点0开始构建结构 result = build_tree(0) print(result)
运行后输出符合预期:
[0, [1, [4]], [2, [5], [6]], [3, [7], [8], [9]]]
关键逻辑说明
- 节点映射字典:将原始列表转换为
{父节点: [子节点列表]}的格式,例如{0: [1,2,3], 1: [4]},大幅提升子节点查询效率。 - 递归构建:对每个节点,先创建包含自身的基础结构,再遍历所有子节点,递归生成子节点的完整嵌套结构并追加到当前节点结构中;无后代的节点直接返回自身的列表形式。
内容的提问来源于stack exchange,提问作者Ray
相关产品推荐
相关产品推荐

