题目:
给你一个二叉树的根结点,返回其结点按 垂直方向(从上到下,逐列)遍历的结果。
如果两个结点在同一行和列,那么顺序则为 从左到右。
解答:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def verticalOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
if not root:
return []
#dic={位置:处于该位置的节点}
dic=defaultdict(list)
#当前节点所处位置为i,则其左节点的位置为i-1,右节点的位置为i+1
q=[(root,0)]
minpos=0
while q:
n=len(q)
for i in range(n):
cur,idx=q.pop(0)
dic[idx].append(cur.val)
if cur.left:
q.append((cur.left,idx-1))
minpos=min(minpos,idx-1)
if cur.right:
q.append((cur.right,idx+1))
res=[]
for i in range(minpos,minpos+len(dic)):
res.append(dic[i])
return res