Python如何根据层级路径列表自动生成指定格式的非二叉菜单树
适配任意长度路径的非二叉树生成方案
核心用路径逐段匹配+节点去重复用的逻辑实现,不需要提前预设路径长度,完全可以适配输入里任意层级的路径。
具体实现步骤
- 先维护两个核心变量:
- 根节点列表:存储所有一级节点(即所有路径的第一个元素对应的节点)
- 节点索引映射:可以用
父节点路径+当前节点名作为key,存储已经创建过的节点对象,避免重复创建相同节点,也不用每次都遍历子节点列表查找,提高效率
- 遍历输入的每一条路径:
- 初始化当前父节点为
None,当前节点的路径前缀为空 - 逐段遍历路径里的节点名:
- 生成当前节点的唯一key:如果父节点为空(当前是一级节点),key就是节点名本身;如果父节点不为空,key就是
父节点key + '/' + 当前节点名 - 检查映射里有没有这个key,不存在就创建新节点,同时如果是根节点就加入根节点列表,不是的话就加入父节点的
child列表 - 从映射里取出当前节点作为下一轮的父节点
- 生成当前节点的唯一key:如果父节点为空(当前是一级节点),key就是节点名本身;如果父节点不为空,key就是
- 整条路径遍历完成后,把最后一个节点的
is_leaf设为True
- 初始化当前父节点为
- 所有路径处理完后,根节点列表就是你要的嵌套服务菜单结构。
代码实现示例(Python)
def build_menu_tree(path_list): root_nodes = [] node_map = {} for path in path_list: parent_key = None current_node = None for idx, node_name in enumerate(path): # 生成当前节点唯一key,避免不同分支同名节点冲突 current_key = f"{parent_key}/{node_name}" if parent_key is not None else node_name if current_key not in node_map: # 新建节点,如果你有自己的NonBinTree类,把这里换成类实例化逻辑即可 new_node = { "name": node_name, "is_root": parent_key is None, "is_leaf": False, "child": [] } node_map[current_key] = new_node # 挂载到对应父节点下 if parent_key is None: root_nodes.append(new_node) else: node_map[parent_key]["child"].append(new_node) # 更新下一轮的父节点信息 current_node = node_map[current_key] parent_key = current_key # 路径最后一个节点标记为叶子 current_node["is_leaf"] = True return root_nodes # 测试输入 input_list = [["hair", "hair cut", "men's haircut"], ["hair", "hair style"], ["skin", "waxing", "arm waxing"]] menu_tree = build_menu_tree(input_list)
输出说明
按你的输入生成的结构完全符合要求:
- hair节点是根节点,子节点有hair cut、hair style
- hair cut的子节点是men's haircut,该节点标记为叶子
- hair style标记为叶子节点
- skin是根节点,子节点是waxing,waxing的子节点是arm waxing(标记为叶子)
内容的提问来源于stack exchange,提问作者Lokesh Ramasetti
相关产品推荐
相关产品推荐

