避免无限递归需在节点类的__repr__中禁用子节点递归,改用浅层表示;双向引用时用weakref.ref存父节点;可视化整棵树应单独实现限深遍历或非递归dfs。

用 dict 或 class 表示树节点时,怎么避免无限递归?
Python 默认的 repr() 和 print() 在遇到循环引用(比如父节点存子节点、子节点又存回父节点)时会直接抛出 RecursionError: maximum recursion depth exceeded。这不是数据错了,是显示逻辑卡住了。
实操建议:
- 节点类中不要在
__repr__里直接递归打印子节点,改用浅层表示,例如f"Node({self.name}, children={len(self.children)})" - 真要可视化整棵树,单独写一个非递归的遍历函数(如用栈模拟 DFS),或限制深度:
def print_tree(node, depth=0, max_depth=3): - 如果必须双向引用,用
weakref.ref存父节点,避免引用计数拖住对象生命周期
用 networkx 绘制组织架构图时,为什么边总是乱的?
默认 networkx 的布局算法(如 spring_layout)不保证父子层级顺序,画出来像一团毛线。它把图当无向网处理,而组织架构本质是有向、分层、带根的树。
实操建议:
- 强制用
graphviz_layout(需装pygraphviz或graphviz):pos = nx.nx_agraph.graphviz_layout(G, prog="dot"),prog="dot"才能按父子方向垂直排布 - 确保图是
nxDiGraph而非nxGraph,否则方向信息丢失 - 手动指定根节点:传入
root="CEO"参数,不然dot可能选错起点
从 JSON 加载组织结构后,如何快速查「某人所有下属」?
原始 JSON 通常是扁平列表(含 id 和 parent_id),直接遍历找下属效率低,O(n²)。每次查都要扫全量数据,1000 人就可能卡顿。
实操建议:
- 预处理建索引:用
defaultdict(list)构建children_map,键为parent_id,值为该父节点下所有子节点 ID 列表 - 用 BFS 或 DFS 递归展开时,只查
children_map[employee_id],避免反复过滤原始列表 - 如果查询频繁且结构不变,把结果缓存成
dict[employee_id] = set(all_subordinate_ids),空间换时间
用 pandas 分析多层级汇报关系时,groupby 为什么不能直接按“上级→下级”聚合?
因为标准 groupby 是单层分组,而汇报链是路径(CEO → VP → Manager → IC),不是固定字段。你没法写 df.groupby(["manager", "sub_manager", "team_lead"])——层级深度不统一。
实操建议:
- 先用
networkx或自定义函数生成每个员工的完整路径(如["CEO", "VP-Eng", "Manager-FE"]),存为新列path - 对
path列做str.split().str[0]取一级上级,或str.len()算层级深度,再分组 - 更稳的方式是用
sqlalchemy+ 递归 CTE(如果数据在数据库),Python 端硬算容易漏掉跨层跳转(如虚线汇报线)
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











