📌  相关文章
📜  二叉树每一层的最小值(1)

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

二叉树每一层的最小值

二叉树是一种常用的数据结构,在树的基础上增加了左右子树的限制。二叉树可以用于搜索、排序、计算表达式等应用中。本文将介绍如何求解二叉树每一层的最小值。

问题描述

给定一个二叉树,编写一个函数来获取该树每一层的最小值。例如,给定以下二叉树:

    3
   / \
  9  20
    /  \
   15   7

应返回其层序遍历结果中的每一层最小值,即[3, 9, 7]。

解决方案
递归算法

一个朴素的思路是对每一层进行遍历后找到最小值,这可以使用二叉树的层序遍历来实现。但是这种方法效率较低,因为每层都需要全遍历一遍。

更好的方法是使用递归算法。我们可以使用一个数组记录每一层的最小值,每次递归到下一层时,将该层节点的值与该层最小值进行比较,如果比最小值还小,则更新最小值。递归结束后,我们就得到了每一层的最小值。

下面是使用递归算法的代码:

def find_min_in_levels(root):
    result = []
    dfs(root, 0, result)
    return result

def dfs(node, level, result):
    if node is None:
        return
    if len(result) <= level:
        result.append(node.val)
    else:
        result[level] = min(result[level], node.val)
    dfs(node.left, level + 1, result)
    dfs(node.right, level + 1, result)

上述代码实现了二叉树每一层最小值的递归算法,主要思路就是对每一层进行遍历,比较得到最小值后存入数组中。

广度优先搜索

除了递归算法,我们还可以使用广度优先搜索遍历二叉树。在每个节点被访问时,我们将该节点的值加入到当前层的列表中,并更新该层最小值。遍历完所有节点后,我们就得到了每一层的最小值。

下面是使用广度优先搜索的代码:

from collections import deque

def find_min_in_levels(root):
    if root is None:
        return []
    result = []
    queue = deque([root])
    while queue:
        level_len = len(queue)
        level = []
        for i in range(level_len):
            node = queue.popleft()
            level.append(node.val)
            if node.left:
                queue.append(node.left)
            if node.right:
                queue.append(node.right)
        result.append(min(level))
    return result
总结

本文介绍了如何求解二叉树每一层的最小值。我们提供了两种不同的方法:递归算法和广度优先搜索。这两种方法都可以解决这个问题,具体选择哪种方法可以根据具体情况评估效率和可读性。