987. 二叉树的垂序遍历

方法一:

class Solution:
    def verticalTraversal(self, root: TreeNode) -> List[List[int]]:
        if root is None: return []
        queue, d = deque([[root, 0, 0]]), collections.defaultdict(list)
        # queue, d = deque([[root, 0, 0]]), {} # 双向队列,{key 左(列) : value (右(行),val)} 同列方便合并
        # queue, d = [[root, 0, 0]], {} # 直接用 list
        while queue:
            node, row, col = queue.popleft() # pop 也可
            node.left and queue.append([node.left, row + 1, col - 1]) # and 妙用
            node.right and queue.append([node.right, row + 1, col + 1])
            # d.setdefault(col, []).append((row, node.val))
            d[col].append((row, node.val))
        
        # sorted(d[k]) (row, node.val)按行排序(同行、同列),sorted(d) 按列排序 key 的列表
		# map 只取排序后的值 val    
        return [list(map(itemgetter(1), sorted(d[k]))) for k in sorted(d)]

方法二:

class Solution:
    def verticalTraversal(self, root: TreeNode) -> List[List[int]]:
        stack, d = [(root, 0, 0)], defaultdict(list)
        while stack:
            node, row, col = stack.pop()
            if node:
                d[col].append((row, node.val))
                stack.extend([(node.right, row + 1, col + 1), (node.left, row + 1, col - 1)])
        return [[item[1] for item in sorted(d[x])] for x in sorted(d)]
        # return [val for _, val in sorted(d[x])] for x in sorted(d)]

Python 字典(Dictionary) setdefault 方法

Python 字典 setdefault() 和 get() 方法 类似, 如果键不存在于字典中,将会添加键并将值设为默认值。

dict.setdefault(key, default=None)
key 查找的键值。
default 键不存在时,设置的默认键值。

如果字典中包含有给定键,则返回该键对应的值,否则返回为该键设置的值。

python itemgetter()

operator 模块中的 itemgetter(),是获取对象指定域中的值。

>>> from operator import itemgetter
>>> a = [1,2,3,4,5]
>>> b = itemgetter(0)
>>> b(a) 
1
>>> c = itemgetter(0,1,2)
>>> c(a) 
(1, 2, 3)

itemgetter 可以对字典进行排序

x = [
	{"语文":80,"数学":90,"英语":70,"物理":92,"化学":83},
	{"语文":82,"数学":70,"英语":78,"物理":90,"化学":80},
	{"语文":86,"数学":89,"英语":73,"物理":82,"化学":88},
	]

x_yuwen = sorted(x, key = itemgeter("语文"))
x_shuxue = sorted(x, key = itemgetter("数学"))
x_wuli = sorted(x, key = lambda x:x["物理"])

使用匿名函数和 itemgetter 都可以对字典进行排序

python deque(双向)队列

Python 标准库中包含了四种队列,分别是 queue.Queue / asyncio.Queue / multiprocessing.Queue / collections.deque

987. 二叉树的垂序遍历_List


in``

rotate()

复制一个新队列

extend()

extendleft()

index()

insert(位置,元素) 在指定位置插入元素

remove(元素) 删除指定元素

reverse 队列翻转

from collections import deque
from operator import itemgetter

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

root = TreeNode(3,TreeNode(9),TreeNode(20,TreeNode(15),TreeNode(7)))

# queue, d = deque([[root, 0, 0]]), {}
queue, d = [[root,0,0]], {} # list,{key 左(列) : value (右(行),val)} 同列方便合并

while queue:
    node, row, col = queue.pop()
    # if node.left:queue.append([node.left, row + 1, col - 1])
    node.left and queue.append([node.left, row + 1, col - 1]) # and 巧用
    node.right and queue.append([node.right, row + 1, col + 1])
    d.setdefault(col, []).append((row, node.val))

# sorted(d[k]) (row, node.val)按行排序(同行、同列),sorted(d) 按列排序 key 的列表
# map 只取排序后的值
[list(map(itemgetter(1), sorted(d[k]))) for k in sorted(d)]