📌  相关文章
📜  以交替顺序打印二叉树每一层的极值节点(1)

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

以交替顺序打印二叉树每一层的极值节点

介绍

这个题目要求我们交替顺序打印二叉树每一层的极值节点。也就是说我们需要找到每一层中最大和最小的节点,然后交替打印它们。这个问题其实也可以看作是一个树的遍历问题,我们可以使用广度优先搜索 (BFS) 来进行实现。

思路

要实现这个功能,我们需要按照层次遍历二叉树,并记录每一层的最大和最小值。我们可以使用一个队列来存储当前层的所有节点。然后遍历这个队列,找到该层的最大和最小值。最后交替打印这些值即可。

具体实现流程如下:

  1. 定义一个队列,将根节点压入队列中。
  2. 定义一个变量 level 来记录当前层的层数。
  3. 利用循环遍历这个队列,每次循环开始前,初始化这一层的最大值为 $-\infty$,最小值为 $+\infty$。
  4. 对于每个节点,将其左右子节点加入队列中。
  5. 每次找到该层的节点的最大和最小值。
  6. 将当前层的最大值和最小值分别加入结果数组中。
  7. 当队列为空时停止遍历。
  8. 返回结果数组。
代码实现

下面是 Python 代码的实现,其中使用了 queue 模块来定义队列:

import queue

def print_extreme_node(root):
    if not root:
        return []

    q = queue.Queue()
    q.put(root)
    level = 0
    result = []

    while not q.empty():
        level += 1
        level_max = float('-inf')
        level_min = float('inf')
        level_size = q.qsize()

        for i in range(level_size):
            node = q.get()
            level_max = max(level_max, node.val)
            level_min = min(level_min, node.val)
            if node.left:
                q.put(node.left)
            if node.right:
                q.put(node.right)

        if level % 2 == 0:
            result.append(level_max)
            result.append(level_min)
        else:
            result.append(level_min)
            result.append(level_max)

    return result
时间复杂度

由于我们需要遍历每个节点一次,因此时间复杂度为 $O(n)$,其中 $n$ 为节点总数。同时,我们需要使用一个队列来存储每一层的节点,因此空间复杂度也为 $O(n)$。