给你一个二叉树的根结点,返回其结点按 垂直方向(从上到下,逐列)遍历的结果。
如果两个结点在同一行和列,那么顺序则为 从左到右。
示例 1:
输入:root = [3,9,20,null,null,15,7] 输出:[[9],[3,15],[20],[7]]
示例 2:
输入:root = [3,9,8,4,0,1,7] 输出:[[4],[9],[3,0,1],[8],[7]]
示例 3:
输入:root = [3,9,8,4,0,1,7,null,null,null,2,5] 输出:[[4],[9,5],[3,0,1],[8,2],[7]]
提示:
- 树中结点的数目在范围
[0, 100]
内 -100 <= Node.val <= 100
时间复杂度:O(N)
空间复杂度:O(N)
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution(object):
def verticalOrder(self, root):
"""
:type root: TreeNode
:rtype: List[List[int]]
"""
# assign each node a vertical order k
# left child k - 1, right child k + 1
# use a hashmap order2node to track all nodes with an order
# Need to know the minimum order
if not root:
return []
min_order = 0
max_order = 0
order2node = defaultdict(list)
# use bfs to traverse the tree
queue = deque([(root, 0)])
while queue:
for _ in range(len(queue)):
# for the current row
node, order = queue.popleft()
min_order = min(min_order, order)
max_order = max(max_order, order)
order2node[order].append(node.val)
if node.left:
queue.append((node.left, order - 1))
if node.right:
queue.append((node.right, order + 1))
res = []
for order in range(min_order, max_order + 1):
res.append(order2node[order])
min_order += 1
return res