📜  二叉树每一层的最大值(1)

📅  最后修改于: 2023-12-03 15:06:19.991000             🧑  作者: Mango

二叉树每一层的最大值

二叉树是一种重要的数据结构,常用于存储和处理层级结构的数据。在二叉树中,每个节点最多有两个子节点,分别称为左子节点和右子节点。而根据节点的层数,可以将二叉树分为多个层级。

在二叉树中,每一层的节点数量可能不同,而我们需要找到每一层的最大节点值。这个问题可以通过深度优先搜索或广度优先搜索来解决。下面,我们将分别介绍这两种解决方案。

深度优先搜索解决方案

深度优先搜索是一种非常常见的算法,它可以用于遍历树、图等结构。对于本问题,我们可以使用深度优先搜索来遍历整个二叉树,并记录每层的最大节点值。具体实现过程如下:

def dfs(root, level, res):
    if not root:
        return
    if len(res) < level:
        res.append(float('-inf'))
    res[level-1] = max(res[level-1], root.val)
    dfs(root.left, level+1, res)
    dfs(root.right, level+1, res)

def max_level_values(root):
    if not root:
        return []
    res = []
    dfs(root, 1, res)
    return res

在上面的代码中,我们定义了一个递归函数 dfs,该函数接收三个参数:

  • root:表示当前节点。
  • level:表示当前节点的层数。
  • res:表示每层的最大节点值列表。

我们首先判断当前节点是否为空,如果为空则直接返回;否则,我们需要处理当前节点。如果当前层数 level 大于 res 列表的长度,则需要往 res 中添加一个新的元素,并将其初值设为负无穷;接着,我们需要更新该层的最大节点值,如果当前节点值比 res[level-1] 大,则更新它;最后,我们递归处理该节点的左右子节点。

max_level_values 函数中,我们先判断根节点是否为空,如果为空,则返回一个空列表;否则,我们创建一个空列表 res 作为每层的最大节点值列表,并调用 dfs 函数来处理二叉树。最后,我们返回 res 列表作为求解结果。

广度优先搜索解决方案

广度优先搜索是一种迭代算法,它可以用于遍历树、图等结构。对于本问题,我们可以使用广度优先搜索来遍历整个二叉树,并记录每层的最大节点值。具体实现过程如下:

from collections import deque

def max_level_values(root):
    if not root:
        return []
    res = []
    queue = deque([root])
    while queue:
        n = len(queue)
        level_max = float('-inf')
        for i in range(n):
            node = queue.popleft()
            level_max = max(level_max, node.val)
            if node.left:
                queue.append(node.left)
            if node.right:
                queue.append(node.right)
        res.append(level_max)
    return res

在上面的代码中,我们首先判断根节点是否为空,如果为空,则返回一个空列表;否则,我们创建一个空列表 res 作为每层的最大节点值列表,创建一个双端队列 queue 并将根节点加入其中。接着,我们进入一个循环,每次处理一个层级的所有节点。在处理该层节点时,我们需要记录该层的最大节点值 level_max,并将队首节点 node 弹出队列,然后判断该节点的左右子节点是否存在,如果存在则加入队列中。最后,我们将 level_max 加入 res 列表中,并继续处理下一层节点,直到队列为空。最后,我们返回 res 列表作为求解结果。

总结

二叉树每一层的最大值是一个常见的问题,我们可以使用深度优先搜索或广度优先搜索来解决这个问题。深度优先搜索需要借助递归函数来遍历整个二叉树,而广度优先搜索则需要借助队列来迭代处理每一层节点。不同的解决方案对时间和空间的复杂度有不同的影响,需要根据实际情况选择合适的算法。