📜  二叉树的垂直顺序遍历,使得节点被单独排序(1)

📅  最后修改于: 2023-12-03 15:06:20.035000             🧑  作者: Mango

二叉树的垂直顺序遍历

二叉树的垂直顺序遍历是指按照节点在垂直方向上的位置来遍历树中的节点。具体来说,对于根节点,我们假设其在垂直方向上的位置为0,然后对于每个节点,如果其在某个节点的左边,则其位置是该节点的位置减一;如果其在某个节点的右边,则其位置是该节点的位置加一。最后我们按照这个位置从小到大排序,对于相同位置的节点,按照层级排序,也就是从上到下。

以下是一个示例的二叉树:

       3
     /   \
    9     8
   / \   / \
  4   0 1   7
     / \
    5   2

按照上述规则,我们可以按照以下的顺序遍历节点:

[[4], [9, 5], [3, 0, 2], [8, 1], [7]]

其中第一行的节点位置为-2,第二行的节点位置为-1,第三行的节点位置为0,第四行的节点位置为1,第五行的节点位置为2。

算法实现

我们可以使用一个字典来保存节点位置相同的节点,然后对于每个节点,递归计算其子节点的位置,并将其加入到对应位置的字典中。最后按照位置从小到大排序,并按照层级将所有节点加入到结果列表中。

以下为Python代码实现:

from collections import defaultdict
class Solution:
    def verticalOrder(self, root: TreeNode) -> List[List[int]]:
        if not root:
            return []
        self.min_pos, self.max_pos = 0, 0
        self.dic = defaultdict(list)
        self.helper(root, 0)
        res = []
        for i in range(self.min_pos, self.max_pos+1):
            res.append(self.dic[i])
        return res
    
    def helper(self, node, pos):
        self.min_pos, self.max_pos = min(self.min_pos, pos), max(self.max_pos, pos)
        self.dic[pos].append(node.val)
        if node.left:
            self.helper(node.left, pos-1)
        if node.right:
            self.helper(node.right, pos+1)

该算法的时间复杂度为$O(nlogn)$,其中$n$是二叉树中的节点数。因为最后还需要对每个位置的节点进行排序,而在Python中的Timsort排序时间复杂度为$O(nlogn)$,所以整个算法的时间复杂度为$O(nlogn)$。

总结

二叉树的垂直顺序遍历是按照节点在垂直方向上的位置排序的算法。该算法可以使用字典来保存位置相同的节点,最后按照位置从小到大排序,并按照层级输出所有节点。该算法的时间复杂度为$O(nlogn)$。