返回

二叉树的层序遍历Ⅱ详解析:自上而下,由左向右!

前端

序言

在计算机科学领域,二叉树是一种重要的数据结构,它由一个根节点和零个或多个子树组成。二叉树的层序遍历,也称为广度优先搜索(BFS),是一种从上到下,从左到右依次访问每个节点的遍历方式。与深度优先搜索(DFS)相比,层序遍历更能体现二叉树的层次结构,因此在许多应用场景中都扮演着重要角色。

层序遍历原理

层序遍历二叉树的基本思想是使用队列(或双端队列)作为辅助数据结构,将二叉树的根节点入队,然后不断地从队列中取出节点并将其子节点入队,直到队列为空。具体步骤如下:

  1. 将根节点入队。
  2. 当队列不为空时,取出队首节点并访问其数据。
  3. 将队首节点的左子节点和右子节点入队(如果存在)。
  4. 重复步骤2和步骤3,直到队列为空。

通过以上步骤,便可以从上到下,从左到右依次访问二叉树中的所有节点。

层序遍历实现

递归实现

def level_order_traversal_recursive(root):
    """
    递归实现二叉树的层序遍历
    
    Args:
        root: 二叉树的根节点
    
    Returns:
        一个列表,包含二叉树中所有节点的数据
    """
    result = []
    level_order_traversal_recursive_helper(root, 0, result)
    return result


def level_order_traversal_recursive_helper(root, level, result):
    """
    递归辅助函数,用于层序遍历二叉树

    Args:
        root: 当前节点
        level: 当前节点的层次
        result: 结果列表
    """
    if not root:
        return
    
    # 如果当前层次的列表不存在,则创建一个新的列表
    if len(result) == level:
        result.append([])
    
    # 将当前节点的数据添加到当前层次的列表中
    result[level].append(root.data)
    
    # 递归地遍历左子树和右子树
    level_order_traversal_recursive_helper(root.left, level + 1, result)
    level_order_traversal_recursive_helper(root.right, level + 1, result)

非递归实现

def level_order_traversal_non_recursive(root):
    """
    非递归实现二叉树的层序遍历
    
    Args:
        root: 二叉树的根节点
    
    Returns:
        一个列表,包含二叉树中所有节点的数据
    """
    if not root:
        return []
    
    queue = [root]
    result = []
    while queue:
        level_size = len(queue)
        current_level = []
        for _ in range(level_size):
            node = queue.pop(0)
            current_level.append(node.data)
            if node.left:
                queue.append(node.left)
            if node.right:
                queue.append(node.right)
        result.append(current_level)
    
    return result

时间复杂度与空间复杂度分析

时间复杂度

层序遍历二叉树的时间复杂度为O(n),其中n为二叉树中的节点数。这是因为在层序遍历过程中,每个节点都会被访问一次且只访问一次。

空间复杂度

层序遍历二叉树的空间复杂度也为O(n),因为在最坏的情况下,所有节点都位于同一层,因此队列中需要存储n个节点。

结语

层序遍历二叉树是一种常用的遍历方式,它可以帮助我们从上到下,从左到右依次访问二叉树中的所有节点。层序遍历在二叉树的很多应用中都有着重要的作用,例如二叉树的宽度优先搜索、二叉树的层序打印等。