二叉树的层次遍历是指按照从树的上到下、从左到右的顺序逐层访问树的节点。这种遍历方式常用于解决与树的层次信息相关的问题,例如求二叉树的最大深度、最小深度、每层节点的平均值等。对于一棵Python二叉树,我们可以使用BFS(Breadth First Search)算法实现层次遍历。

使用BFS进行层次遍历

层次遍历的关键在于使用队列来保存待访问的节点。具体步骤如下:

  1. 首先,创建一个空队列,并将根节点入队。
  2. 然后,循环执行以下步骤:
    • a. 从队列中取出一个节点,并访问该节点。
    • b. 将该节点的左子节点和右子节点依次入队(如果存在)。
  3. 直到队列为空为止。

这样,我们就完成了二叉树的层次遍历。

示例代码实现

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

def levelOrder(root):
    if not root:
        return []
    
    result = []
    queue = [root]
    
    while queue:
        level = []
        level_size = len(queue)
        
        for _ in range(level_size):
            node = queue.pop(0)
            level.append(node.val)
            
            if node.left:
                queue.append(node.left)
                
            if node.right:
                queue.append(node.right)
        
        result.append(level)
    
    return result

以上代码中,我们首先定义了二叉树的节点类TreeNode,包含节点值val、左子节点left和右子节点right。然后,我们定义了一个函数levelOrder,用于实现二叉树的层次遍历。

在函数内部,我们首先判断根节点root是否为空,如果为空,则直接返回一个空列表。接下来,我们创建一个空列表result,用于保存最终的层次遍历结果。同时,我们创建一个队列queue,并将根节点root入队。

接着,我们使用while循环进行层次遍历。在每一层遍历之前,我们创建一个空列表level,用于保存当前层节点的值。同时,我们获取当前队列中的节点数量level_size,该数量即为当前层的节点数量。

接下来的for循环中,我们依次遍历当前层的所有节点。在循环中,我们从队列中取出一个节点node,并将其值添加到level列表中。然后,我们检查节点的左子节点和右子节点是否存在,如果存在,则分别将它们入队。

当当前层的所有节点遍历完成后,我们将该层的结果level添加到result列表中。然后,继续下一个层的遍历,直到队列为空为止。

最后,我们返回最终的层次遍历结果result。