You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python如何根据层级路径列表自动生成指定格式的非二叉菜单树

适配任意长度路径的非二叉树生成方案

核心用路径逐段匹配+节点去重复用的逻辑实现,不需要提前预设路径长度,完全可以适配输入里任意层级的路径。

具体实现步骤

  • 先维护两个核心变量:
    • 根节点列表:存储所有一级节点(即所有路径的第一个元素对应的节点)
    • 节点索引映射:可以用父节点路径+当前节点名作为key,存储已经创建过的节点对象,避免重复创建相同节点,也不用每次都遍历子节点列表查找,提高效率
  • 遍历输入的每一条路径:
    1. 初始化当前父节点为None,当前节点的路径前缀为空
    2. 逐段遍历路径里的节点名:
      • 生成当前节点的唯一key:如果父节点为空(当前是一级节点),key就是节点名本身;如果父节点不为空,key就是父节点key + '/' + 当前节点名
      • 检查映射里有没有这个key,不存在就创建新节点,同时如果是根节点就加入根节点列表,不是的话就加入父节点的child列表
      • 从映射里取出当前节点作为下一轮的父节点
    3. 整条路径遍历完成后,把最后一个节点的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 13:09:02