Python实现基于children列表的多叉树按层打印
解决方案:多叉树按层打印节点值(每层一行)
这问题本质是多叉树的层序遍历(广度优先遍历),核心思路是用队列逐层处理节点,把同一层的所有节点值拼接成字符串后打印。下面是具体的实现步骤和代码:
实现思路
- 队列辅助遍历:利用队列的「先进先出」特性,确保我们能按从上到下、从左到右的顺序处理每一层的节点。
- 分层处理:每次处理队列时,先记录当前队列的长度(即当前层的节点总数),然后一次性处理完这一层的所有节点,避免不同层的节点混合。
- 拼接与入队:处理当前层节点时,把它们的
value拼接成一行字符串;同时将每个节点的子节点全部加入队列,为下一层处理做准备。
Python 代码实现
from collections import deque class Node: def __init__(self, value, children): self.value = value self.children = children def print_tree_by_level(root): if not root: return # 用deque实现队列,popleft效率更高 queue = deque([root]) while queue: # 获取当前层的节点数量 level_size = len(queue) current_line = "" # 处理当前层的所有节点 for _ in range(level_size): node = queue.popleft() # 拼接当前节点的值到行字符串 current_line += str(node.value) # 将子节点加入队列(空列表不会添加任何元素) queue.extend(node.children) # 打印当前层的结果 print(current_line) # 测试示例树 exampleTree = Node(1,[Node(2,[]),Node(3,[Node(4,[Node(5,[]),Node(6,[Node(7,[])])])])]) print_tree_by_level(exampleTree)
代码说明
- 队列选择:使用
collections.deque而不是普通列表,因为deque.popleft()的时间复杂度是O(1),比列表的pop(0)(O(n))效率高很多,适合处理较大的树。 - 边界处理:如果传入的根节点是
None,函数直接返回,避免报错。 - 分层逻辑:通过
level_size = len(queue)锁定当前层的节点数,确保我们只处理当前层的节点,不会混入下一层的节点。 - 子节点处理:直接用
queue.extend(node.children)将子节点加入队列,空的children列表不会给队列添加任何元素,无需额外判断。
运行上述代码后,输出结果完全符合预期:
1 23 4 56 7
内容的提问来源于stack exchange,提问作者Alex Helvaty




