[python] next
参照leetcode 2196. 根据描述创建二叉树 理解python中的next
class Solution:
def createBinaryTree(self, descriptions: List[List[int]]) -> Optional[TreeNode]:
d=defaultdict(TreeNode)
vals=set()
for parent,child,isL in descriptions:
if isL:
d[parent].left=d[child]
else:
d[parent].right=d[child]
vals.add(child)
for v,node in d.items():
node.val=v
return next(node for v,node in d.items() if v not in vals)
- next 的具体作用
在最后一行代码中:
return next(node for v, node in nodes.items() if v not in vals)
next 的作用是 从生成器表达式中提取第一个满足条件的根节点。具体来说:
- 生成器表达式:
(node for v, node in nodes.items() if v not in vals)
会遍历所有节点,筛选出父节点值 v 不在 vals (即未作为子节点出现)的节点。 - 唯一根节点:由于二叉树只有一个根节点(即没有父节点的节点), next 会返回第一个(也是唯一一个)符合条件的节点。
- 为何使用 next 而不是循环?
- 高效性:生成器表达式是惰性计算的,当找到第一个符合条件的节点时立即停止遍历,无需遍历所有节点。
- 简洁性:使用 next 可以直接提取结果,避免显式循环和临时变量。
- 异常处理:若没有符合条件的根节点(理论上不可能), next 会抛出
StopIteration
,但题目保证输入合法,因此无需额外处理。