【二叉树】【层序遍历】leetcode314.二叉树的垂直遍历

题目:
给你一个二叉树的根结点,返回其结点按 垂直方向(从上到下,逐列)遍历的结果。

如果两个结点在同一行和列,那么顺序则为 从左到右。
【二叉树】【层序遍历】leetcode314.二叉树的垂直遍历_第1张图片
【二叉树】【层序遍历】leetcode314.二叉树的垂直遍历_第2张图片
【二叉树】【层序遍历】leetcode314.二叉树的垂直遍历_第3张图片
【二叉树】【层序遍历】leetcode314.二叉树的垂直遍历_第4张图片
解答:

# 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

你可能感兴趣的:(Python,编程,leetcode,算法)