Python 实现无限级分类树状结构生成算法与缓存优化
本文介绍如何使用 Python 生成无限级分类的树状结构。通过递归算法处理数据库中的 parent 字段,构建层级关系。针对递归可能带来的性能问题,引入缓存机制优化执行效率,避免重复计算。文章包含完整代码示例及优化前后的逻辑对比,适用于权限管理、栏目分级等场景。
后端开发人员通常对无限级分类的处理印象深刻,这往往需要投入较多时间进行设计与实现。
无限级分类树状结构在实际应用中十分广泛。例如,后端需要从数据库中读取用户权限数据并生成树状结构,前端获取该权限树后,即可依据层级展示用户有权访问的栏目。此外,网站栏目的多级分类也是典型应用场景。

初次面对树状结构生成需求时,往往令人感到棘手。经过探索,发现一种代码简洁且逻辑清晰的解决方案:递归算法。
首先,需确保数据库中存储的类别信息符合特定格式。
[
{"id": 1, "name": '电器', "parent": 0},
{"id": 2, "name": '水果', "parent": 0},
{"id": 3, "name": '家用电器', "parent": 1},
{"id": 4, "name": '电吹风', "parent": 3},
{"id": 5, "name": '电风扇', "parent": 3},
{"id": 6, "name": '台灯', "parent": 3},
{"id": 7, "name": '商用电器', "parent": 1},
{"id": 8, "name": '大型电热锅', "parent": 7},
]
数据表中通过 parent 字段记录当前条目的父级编号。例如,电吹风的 parent 为 3,表示其属于家用电器;而家用电器的 parent 为 1,表示其属于电器类产品。虽然电吹风与电器之间没有直接的标识关联,但需要通过树状结构明确展示“电器 <- 家用电器 <- 电吹风”的层级关系。
通过 parent 字段追溯父级编号并建立关联的过程是循环往复的,直至遍历所有节点。这一过程与递归算法的特性高度契合,因此可以较为轻松地编写出对应的递归代码。
def generate_tree(source, parent):
tree = []
for item in source:
if item["parent"] == parent:
item["child"] = generate_tree(source, item["id"])
tree.append(item)
return tree
只需将数据库中存储的数据传递给 generate_tree 函数即可。该递归代码在循环过程中,利用 parent 字段查找子节点,并将找到的子节点添加到树结构中。完整实现代码如下。
import json
def generate_tree(source, parent):
tree = []
for item in source:
if item["parent"] == parent:
item["child"] = generate_tree(source, item["id"])
tree.append(item)
return tree
if __name__ == '__main__':
permission_source = [
{"id": 1, "name": '电器', "parent": 0},
{"id": 2, "name": '水果', "parent": 0},
{"id": 3, "name": '家用电器', "parent": 1},
{"id": 4, "name": '电吹风', "parent": 2},
{"id": 5, "name": '电风扇', "parent": 3},
{"id": 6, "name": '台灯', "parent": 3},
{"id": 7, "name": '商用电器', "parent": 1},
{"id": 8, "name": '大型电热锅', "parent": 7},
]
permission_tree = generate_tree(permission_source, 0)
print(json.dumps(permission_tree, ensure_ascii=False))
运行上述代码,检查生成的结构是否符合预期。
使用缓存优化算法
原始递归算法中存在大量重复计算,这不仅消耗额外资源,还会降低函数执行效率。因此,需要对递归逻辑进行优化,此处采用缓存优化法来提升性能。
优化的基本思路是:每次找到节点关系后,将该条目的编号加入一个缓存列表中,标记该条目已处理。当函数再次执行并遇到已缓存的条目时,直接跳过。代码改动较小,仅需增加一个缓存列表及相应的控制流语句即可。
def generate_tree(source, parent, cache=[]):
tree = []
for item in source:
if item["id"] in cache:
continue
if item["parent"] == parent:
cache.append(item["id"])
item["child"] = generate_tree(source, item["id"], cache)
tree.append(item)
return tree
至此,无限级分类树状结构的生成算法及其优化方案介绍完毕。
关于 Python 无限级分类树状结构生成算法的实现介绍至此。如需了解更多 Python 相关技术内容,可搜索本站往期文章或浏览后续内容,感谢支持。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













