📅  最后修改于: 2023-12-03 15:25:53.933000             🧑  作者: Mango
本文介绍了一种将二叉树按照垂直顺序打印的方法,基于地图的思想,从上到下,从左到右地遍历二叉树,并将节点按垂直位置进行归类。最后输出一个列表,列表中每个元素为一列。每列中的元素按照从上到下的顺序排列。
3
/ \
9 20
/ \
15 7
[
[9],
[3,15],
[20],
[7]
]
columnTable
存储每列中所有节点的值,键为列的位置,值为节点的值列表columnMin
存储每列的最小值,键为列的位置,值为该列中节点的最小位置columnMax
存储每列的最大值,键为列的位置,值为该列中节点的最大位置queue
存储当前需要处理的节点queue
并将根节点(位置为0)入队node
并获取它的位置col
node.val
添加到columnTable
字典中对应列的值列表中columnMin
和columnMax
node
的左右子节点入队,位置分别为 col-1
和 col+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