树结构工具 - TreeUtil

由来

在菜单管理、组织架构、分类目录等场景中,树形结构是常见的数据组织方式。TreeUtil 提供了从扁平数据构建树结构的方法。

TreeNode

树节点的数据结构:

from hutool import TreeUtil

# 从扁平数据构建树
data = [
    {"id": 1, "parentId": 0, "name": "根节点"},
    {"id": 2, "parentId": 1, "name": "子节点1"},
    {"id": 3, "parentId": 1, "name": "子节点2"},
    {"id": 4, "parentId": 2, "name": "孙节点1"},
]

tree = TreeUtil.build(data)
# 返回树结构的根节点列表

方法

构建树

# 默认使用 id/parentId 字段
tree = TreeUtil.build(data)

# 自定义字段名
tree = TreeUtil.build(data, id_field="nodeId", parent_field="pid")

# 指定根节点 ID
tree = TreeUtil.build(data, root_id=0)

遍历

# 广度优先遍历
TreeUtil.foreach(tree, lambda node: print(node.name))

# 深度优先遍历
TreeUtil.foreach_df(tree, lambda node: print(node.name))

转换

# 树转扁平列表
flat_list = TreeUtil.to_list(tree)

# 树转字典
tree_map = TreeUtil.to_map(tree)

查找

# 根据 ID 查找节点
node = TreeUtil.get_node_id(tree, 4)

其他

# 构建单根树
root = TreeUtil.build_single(data, root_id=0)

# 获取节点完整路径名称
path = TreeUtil.get_parents_name(tree, 4, separator="/")  # "根/父/子"

# 获取祖先 ID 列表
ids = TreeUtil.get_parents_id(tree, 4)  # [1, 2, 4]

# 创建空节点
node = TreeUtil.create_empty_node(99, "new_node", parent_id=1)