一般情况下,前端所要的数据是直接带children的树,而数据库给的字段均是parent自关联,博主提供了两种方式生成树。

  1. 使用create_tree_children方法,可递归查找指定父节点下的所有孩子节点,但是python限制默认递归次数为1000,当数据量特别大的时候,很容易出现问题
  2. 既然递归容易出现问题,那么可以用循环实现树的递归吗?答案是肯定的。
    2-1. 通过to_tree_dict生成key为主键的字典
    2-2. 通过from_list过滤出根节点,并在父节点下建立对应的孩子节点
    2-3. 插入节点insert_node之所以传入字典,是因为有的孩子节点是跨表插入,比如文件夹下插入文件,而文件保存在其它表中,则可以先通过to_tree_dict转字典,再insert_node到文件夹树下,之后调用文件夹树的from_list即可。
class BTree(object):def __init__(self,tree,primary_key='id',parent_key='parent',label='children'):self.tree = treeself.primary_key = primary_keyself.parent_key = parent_keyself.label=labeldef create_tree_children(self,parent_id=None):"""每个节点下生成对应的孩子节点:param parent_id: 可返回指定节点下的孩子节点:return:"""if not len(self.tree):return []for item in self.tree:if parent_id:if item.get(self.primary_key) == parent_id:children = self.search_children_by_pid(item.get(self.primary_key),[])item.update({self.label:children})breakelse:# 通过parent来组装当前节点的孩子节点children = self.search_children_by_pid(item.get(self.primary_key),[])item.update({self.label:children})if parent_id:# 仅返回该节点self.tree = list(filter(lambda x: x and x.get(self.label),self.tree))return self.treedef search_children_by_pid(self,pid,id_results:list):"""返回指定节点下的所有孩子节点:params pid:父节点id:params id_results: 记录节点id,防止重复遍历:return:"""if not len(self.tree):return []children = []for item in self.tree:# 如果当前节点未被遍历过if item.get(self.primary_key) not in id_results:if item.get(self.parent_key)==pid:id_resultd.append(item.get(self.primary_key))# 递归插入子节点new_item.update({self.label:self.search_children_by_pid(new_item.get(self.primary_key),id_results)})children.append(new_item)return childrendef from_list(self):def __tree_filter(node,info):if node.get(self.parent_key) and info.get(node.get(self.parent_key)):# 在父节点下添加孩子info[node.get(self.parent_key)].get(self.label).append(node)# 过滤掉孩子节点return not node.get(self.parent_key)info=self.to_tree_dict()self.tree=list(filter(lambda x:__tree_filter(x,info),self.tree))def to_tree_dict(self):def allocate_node(cur_node,new_node):cur_node[new_node.get(self.primary_key)]=new_nodenew_node[self.label]=[]return cur_node# key为主键,方便直接索引获取info = reduce(allocate_node,self.tree,{})return infodef insert_node(self,nodes:dict):# 传入一个key为主键的字典,插入节点for value in nodes.values():self.tree.append(value)def get_tree(self):return self.tree

效果展示:

递归树以及循环树算法相关推荐

  1. 递归式求时间复杂度的递归树的方法举例说明

    用递归树的时候注意一下递归树的写法规则: (1) 每层的节点为T(n) = kT(n / m) + f(n)中的f(n)在当前的n/m下的值,所以每一层并不是写为T(n / m) , 并且递归树的根节 ...

  2. 求递归算法时间复杂度:递归树

    引用自:http://www.cnblogs.com/wu8685/archive/2010/12/21/1912347.html 递归算法时间复杂度的计算方程式一个递归方程: 在引入递归树之前可以考 ...

  3. 数据结构与算法之美笔记——基础篇(中):树,二叉树,二叉查找树,平衡二叉查找树,红黑树,递归树,堆

    树: A 节点就是 B 节点的父节点,B 节点是 A 节点的子节点.B.C.D 这三个节点的父节点是同一个节点,所以它们之间互称为兄弟节点.我们把没有父节点的节点叫作根节点,也就是图中的节点 E.我们 ...

  4. 遍历递归树求递推数列通项

    考虑K阶变系数线性递推方程: 现给定初值a1,a2,-,ak和n>k,要求编程打印an,an-1,-,ak+1的值 该问题用常规的迭代法非常容易解决,现在要考虑的是用遍历递归调用树的方法求解.n ...

  5. 递归树求解递归算法的时间复杂度

    递归算法时间复杂度的计算方程式一个递归方程: 在引入递归树之前可以考虑一个例子: T(n) = 2T(n/2) + n2 迭代2次可以得: T(n) = n2 + 2(2T(n/4) + (n/2)  ...

  6. 如何用递归树求快速排序时间复杂度

    其实也就是点看算法导论的心得,感觉算法导论写的有点不详细的补充 快速排序 我的理解就是利用分治法 ,递归排序最后合并的排序,因为快速排序的最坏时间复杂度比较低所以快速被叫做快速排序如图 对于求快速排序 ...

  7. 看动画学算法之:递归和递归树

    文章目录 简介 递归树和阶乘 斐波那契数列 GCD最大公约数 N中选K 0-1背包问题 硬币找零问题 数组的最长递增子序列 旅行商问题 简介 在之前我们介绍的很多数据结构和算法都用到了递归,递归非常容 ...

  8. oracle树结构统计,ORACLE 递归树型结构统计汇总

    区域平台统计报表,省--市--区 汇总,还有各级医院,汇总与列表要在一个列表显示. 用到ORACLE 会话时临时表  GLOBAL TEMPORARY TABLE     ON COMMIT PRES ...

  9. 关于递归转换成循环的思想

    1 问题描述 今天在看Python的课程时 听到老师讲到了递归 实际上 在我大学学编程课的时候 就听到老师们说过 递归不是一种很好定义函数逻辑的方式 这是因为在递归过程中 程序为了保存函数现场的变量需 ...

最新文章

  1. 如何通过深度学习轻松实现自动化监控?
  2. Linux之xargs
  3. TS各个表 与 SECTION 的解析 CAS原理
  4. Rust小试牛刀之猜猜看游戏
  5. QT正则表达式---针对IP地址
  6. WPS2019政府版本
  7. 理解运放的虚断和虚短
  8. thinkphp5 模板使用php,模板 · ThinkPHP5.1完全开发手册 · 看云
  9. CC2530采集重力加速度MMA7455的值
  10. 视频预测算法vid2vid比MCNet好在哪里?
  11. Windows10系统自带Microsoft图片发黄
  12. matlab中模型预测控制工具箱中m文件optimizer代码里面有个built in kalman 的选项
  13. English:现在分词和过去分词的用法
  14. C++的errorC2039
  15. 开发者福利chatGPT软件Build Software. Fast.
  16. 高德地图 绘制 柱状图形
  17. java斗地主发牌代码_[Java源码]扑克牌——斗地主发牌实现
  18. java 3_4_5判断三角形_小学四年级数学下册【填空题】易错题专项训练
  19. 9月生日会|共喜共庆,潮玩中秋!
  20. 统计一个数中二进制数1的个数(新手篇10)

热门文章

  1. Linux操作系统webmin的安装
  2. oralce 查看表空间使用情况
  3. 生成小程序太阳码-微信文档错误
  4. nowcoder19153 无限手套
  5. 下载音/视频文件小技巧
  6. 投机客获利手段-做多或做空
  7. android 神器 自动连接手机版下载,手机屏幕自动点击
  8. java 可迭代对象,什么是可迭代对象(Iterable objects)?
  9. CCF认证 2015-12 消除类游戏
  10. 中职计算机高级职称评审条件,职校老师如何评审职称,为评职称应做好哪些工作?...