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
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)]
版权声明:本文为weixin_43955170原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。