博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【leetcode】987. Vertical Order Traversal of a Binary Tree
阅读量:6756 次
发布时间:2019-06-26

本文共 2699 字,大约阅读时间需要 8 分钟。

题目如下:

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 = Noneclass 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

 

转载于:https://www.cnblogs.com/seyjs/p/10435597.html

你可能感兴趣的文章
WIN7切换用户
查看>>
接口测试(五)--Http headers
查看>>
1175:除以13
查看>>
DataSet转换为Byte[]方法
查看>>
Centos文件查看命令字符
查看>>
DSP c6678的启动方式
查看>>
遮罩层点击空白退出代码
查看>>
[HNOI2012]集合选数 BZOJ2734
查看>>
SpringCloud之Eureka集群
查看>>
转 asterisk拨号规则
查看>>
PS1修改xshell命令行样式
查看>>
部门表递归查询
查看>>
Analysis by Its History Exercise 2.3
查看>>
陶哲轩实分析 习题 7.1.5
查看>>
团队项目—后续阶段第三天
查看>>
python中的gil是什么?
查看>>
BFS 2015百度之星初赛2 HDOJ 5254 棋盘占领
查看>>
黑马程序员 ——ios点语法和类的三大特性
查看>>
Redis数据库总结
查看>>
python 阿狸的进阶之路(8)
查看>>