【leetcode】987. Vertical Order Traversal of a Binary Tree

题目如下:

Given a binary tree, return the vertical order traversal of its nodes values.

For each node at position (X, Y), its left and right children respectively will be at positions (X-1, Y-1)and (X+1, Y-1).

Running a vertical line from X = -infinity to X = +infinity, whenever the vertical line touches some nodes, we report the values of the nodes in order from top to bottom (decreasing Y coordinates).

If two nodes have the same position, then the value of the node that is reported first is the value that is smaller.

Return an list of non-empty reports in order of Xcoordinate.  Every report will have a list of values of nodes.

 

Example 1:

Input: [3,9,20,null,null,15,7]
Output: [[9],[3,15],[20],[7]]
Explanation: 
Without loss of generality, we can assume the root node is at position (0, 0):
Then, the node with value 9 occurs at position (-1, -1);
The nodes with values 3 and 15 occur at positions (0, 0) and (0, -2);
The node with value 20 occurs at position (1, -1);
The node with value 7 occurs at position (2, -2).

Example 2:

Input: [1,2,3,4,5,6,7]
Output: [[4],[2],[1,5,6],[3],[7]]
Explanation: 
The node with value 5 and the node with value 6 have the same position according to the given scheme.
However, in the report "[1,5,6]", the node value of 5 comes first since 5 is smaller than 6.

 

Note:

  1. The tree will have between 1 and 1000 nodes.
  2. Each node's value will be between 0 and 1000.

解题思路:我的方法比较简单粗暴。用dic[x] = [(v,y)] 来记录树中每一个节点,x是节点的横坐标,y是纵坐标,v是值。接下来遍历树,并把每个节点都存入dic中。dic中每个key都对应Output中的一个list,按key值大小依次append到Output中,接下来再对每个key所对应的val按(v,y)优先级顺序排序即可。

代码如下:

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def verticalTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[List[int]]
        """
        dic = {}
        queue = [(root,0,0)] #(node,x)
        while len(queue) > 0:
            node,x,y = queue.pop(0)
            if x in dic:
                dic[x].append((node.val,y))  # node.val,y
            else:
                dic[x] = [(node.val,y)]
            if node.left != None:
                queue.append((node.left,x-1,y-1))
            if node.right != None:
                queue.append((node.right,x+1,y-1))

        res = []
        keylist = sorted(dic.viewkeys())

        def cmpf(v1,v2):
            if v1[1] != v2[1]:
                return v2[1] - v1[1]
            return v1[0] - v2[0]
        for i in keylist:
            dic[i].sort(cmp=cmpf)
            tl = []
            for j in dic[i]:
                tl.append(j[0])
            res.append(tl)
        return res
        

 

posted @ 2019-02-26 10:13  seyjs  阅读(458)  评论(0编辑  收藏  举报