Leetcode 987:二叉树的垂序遍历(超详细的解法!!!)

给定二叉树,按垂序遍历返回其结点值。

对位于 (X, Y) 的每个结点而言,其左右子结点分别位于 (X-1, Y-1)(X+1, Y-1)

把一条垂线从 X = -infinity 移动到 X = +infinity ,每当该垂线与结点接触时,我们按从上到下的顺序报告结点的值( Y 坐标递减)。

如果两个结点位置相同,则首先报告的结点值较小。

X 坐标顺序返回非空报告的列表。每个报告都有一个结点值列表。

示例 1:

输入:[3,9,20,null,null,15,7]
输出:[[9],[3,15],[20],[7]]
解释: 
在不丧失其普遍性的情况下,我们可以假设根结点位于 (0, 0):
然后,值为 9 的结点出现在 (-1, -1);
值为 3 和 15 的两个结点分别出现在 (0, 0) 和 (0, -2);
值为 20 的结点出现在 (1, -1);
值为 7 的结点出现在 (2, -2)。

示例 2:

输入:[1,2,3,4,5,6,7]
输出:[[4],[2],[1,5,6],[3],[7]]
解释:
根据给定的方案,值为 5 和 6 的两个结点出现在同一位置。
然而,在报告 "[1,5,6]" 中,结点值 5 排在前面,因为 5 小于 6。

提示:

  1. 树的结点数介于 11000 之间。
  2. 每个结点值介于 01000 之间。

解题思路

这个问题首先想到的就是暴力破解,将每个节点的对应坐标存储到一个字典中,然后遍历字典将每一列存放到结果中去。

from collections import defaultdict
class Solution:
    def verticalTraversal(self, root: 'TreeNode') -> 'List[List[int]]':
        self.tree = defaultdict(lambda : defaultdict(list))
        self.dfs(root, 0, 0)
        res = list()
        for x in sorted(self.tree.keys()):
            tmp = list()
            for y in sorted(self.tree[x].keys()):
                tmp += sorted(self.tree[x][y])
            res.append(tmp)
            
        return res
    
    def dfs(self, root, x, y):
        if root:
            self.tree[x][y].append(root.val)
            self.dfs(root.left, x-1, y+1)
            self.dfs(root.right, x+1, y+1)

在使用cpp的时候,我们可以使用map这个结构,这样我们就不用排序了。

我将该问题的其他语言版本添加到了我的GitHub Leetcode

如有问题,希望大家指出!!!

你可能感兴趣的:(Problems,leetcode解题指南)