zoukankan      html  css  js  c++  java
  • 边工作边刷题:70天一遍leetcode: day 90

    Binary Tree Vertical Order Traversal

    要点:这题不难,就是要找到最简单的方法还需要有些考量。主要的原因是Tree的宽度是不知道的

    • 用map记录min->max的区间,最后再iterate build返回数组。这样可以不用多traverse一遍Tree。
    • traversal可以是dfs或者bfs
    • dfs/bfs时候要存结点的pos(有一种类似解法是创建一个2d map[col][height]来存结点)。这个的意思就是left/right结点的pos是依赖于上一层的,而不是global的

    效率:

    • keys: 24.83% => 42.28%,for k in cols vs for k in cols.keys()
    • next vs. counting: 42.28% => 58.39%

    https://repl.it/Ccf7/2

    
    # Given a binary tree, return the vertical order traversal of its nodes' values. (ie, from top to bottom, column by column).
    
    # If two nodes are in the same row and column, the order should be from left to right.
    
    # Examples:
    
    # Given binary tree [3,9,20,null,null,15,7],
    #   3
    #   /
    #  /  
    #  9  20
    #     /
    #   /  
    #   15   7
    # return its vertical order traversal as:
    # [
    #   [9],
    #   [3,15],
    #   [20],
    #   [7]
    # ]
    # Given binary tree [3,9,8,4,0,1,7],
    #      3
    #     /
    #   /  
    #   9   8
    #   /  /
    #  /  /  
    #  4  01   7
    # return its vertical order traversal as:
    # [
    #   [4],
    #   [9],
    #   [3,0,1],
    #   [8],
    #   [7]
    # ]
    # Given binary tree [3,9,8,4,0,1,7,null,null,null,2,5] (0's right child is 2 and 1's left child is 5),
    #      3
    #     /
    #   /  
    #   9   8
    #   /  /
    #  /  /  
    #  4  01   7
    #     /
    #   /  
    #   5   2
    # return its vertical order traversal as:
    # [
    #   [4],
    #   [9,5],
    #   [3,0,1],
    #   [8,2],
    #   [7]
    # ]
    
    
    from collections import defaultdict, deque
    
    # 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 verticalOrder(self, root):
            """
            :type root: TreeNode
            :rtype: List[List[int]]
            """
            if not root: return []
            cols = defaultdict(list)
            q = deque([(root, 0)])
            while q:
                ql = len(q)
                for _ in xrange(ql):
                    root, pos= q.popleft()
                    cols[pos].append(root.val)
                    if root.left:
                        q.append((root.left, pos-1))
                        
                    if root.right:
                        q.append((root.right, pos+1))
            return [cols[k] for k in xrange(min(cols.keys()), max(cols.keys())+1)]
    
    
  • 相关阅读:
    nodeJs学习-10 模板引擎 ejs语法案例
    nodeJs学习-09 模板引擎 jade、ejs
    nodeJs学习-08 cookie、session
    nodeJs学习-07 express、body-parser;链式操作next
    RedHat6.5-Linux安装telnet服务
    druid数据源配置
    rpm安装MySQL
    黎活明给程序员的忠告
    为什么要使用JS模板引擎
    Angularjs调用公共方法与共享数据
  • 原文地址:https://www.cnblogs.com/absolute/p/5815820.html
Copyright © 2011-2022 走看看