📜  按垂直顺序打印二叉树 |设置 2(基于地图的方法)(1)

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

按垂直顺序打印二叉树 | 设置 2(基于地图的方法)

介绍

本文介绍了一种将二叉树按照垂直顺序打印的方法,基于地图的思想,从上到下,从左到右地遍历二叉树,并将节点按垂直位置进行归类。最后输出一个列表,列表中每个元素为一列。每列中的元素按照从上到下的顺序排列。

示例
输入
   3
  / \
 9  20
   /  \
  15   7
输出
[
  [9],
  [3,15],
  [20],
  [7]
]
算法
  1. 用一个字典columnTable存储每列中所有节点的值,键为列的位置,值为节点的值列表
  2. 用一个字典columnMin存储每列的最小值,键为列的位置,值为该列中节点的最小位置
  3. 用一个字典columnMax存储每列的最大值,键为列的位置,值为该列中节点的最大位置
  4. 用一个队列queue存储当前需要处理的节点
  5. 初始化队列queue并将根节点(位置为0)入队
  6. 队列不为空时循环:
    1. 取出队头节点node并获取它的位置col
    2. 将节点值node.val添加到columnTable字典中对应列的值列表中
    3. 更新columnMincolumnMax
    4. 分别将node的左右子节点入队,位置分别为 col-1col+1
代码实现
def verticalOrder(root):
    if not root:
        return []

    # 初始化变量
    columnTable = {}
    columnMin = {}
    columnMax = {}
    queue = [(root, 0)]

    # 循环处理队列中的节点
    while queue:
        node, col = queue.pop(0)

        # 将节点值添加到 columnTable 字典中对应列的值列表中
        if col in columnTable:
            columnTable[col].append(node.val)
        else:
            columnTable[col] = [node.val]

        # 更新 columnMin 和 columnMax
        columnMin[col] = min(columnMin.get(col, float('inf')), col)
        columnMax[col] = max(columnMax.get(col, float('-inf')), col)

        # 将左右子节点入队
        if node.left:
            queue.append((node.left, col - 1))
        if node.right:
            queue.append((node.right, col + 1))

    # 生成结果列表
    res = []
    for col in range(columnMin[min(columnMin.keys()):], columnMax[max(columnMax.keys())] + 1):
        res.append(columnTable[col])
    return res
复杂度分析
  • 时间复杂度:$O(n\log n)$,其中 $n$ 是节点数。需要遍历所有节点,并排序所有列。
  • 空间复杂度:$O(n)$。需要用字典存储每列中节点的值列表和最小最大位置信息,以及用队列存储每次需要处理的节点。