You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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)

代码说明

  1. 队列选择:使用collections.deque而不是普通列表,因为deque.popleft()的时间复杂度是O(1),比列表的pop(0)(O(n))效率高很多,适合处理较大的树。
  2. 边界处理:如果传入的根节点是None,函数直接返回,避免报错。
  3. 分层逻辑:通过level_size = len(queue)锁定当前层的节点数,确保我们只处理当前层的节点,不会混入下一层的节点。
  4. 子节点处理:直接用queue.extend(node.children)将子节点加入队列,空的children列表不会给队列添加任何元素,无需额外判断。

运行上述代码后,输出结果完全符合预期:

1
23
4
56
7

内容的提问来源于stack exchange,提问作者Alex Helvaty

火山引擎 最新活动