Python 三元树路径
我正在解决以下问题: 给定一个三元树(树的每个节点最多有三个 子级),查找所有根到叶的路径 示例: 我的代码如下:Python 三元树路径,python,algorithm,data-structures,functional-programming,ternary-tree,Python,Algorithm,Data Structures,Functional Programming,Ternary Tree,我正在解决以下问题: 给定一个三元树(树的每个节点最多有三个 子级),查找所有根到叶的路径 示例: 我的代码如下: from __future__ import annotations import itertools from collections import deque, Iterable class TernaryNode: def __init__(self, val: int) -> None: self.children: list[Tern
from __future__ import annotations
import itertools
from collections import deque, Iterable
class TernaryNode:
def __init__(self, val: int) -> None:
self.children: list[TernaryNode] = []
self.val = val
def __repr__(self) -> str:
return str(self.val)
def ternary_tree_paths(root: TernaryNode) -> Iterable[Iterable[int]]:
def _visit(node: TernaryNode) -> Iterable[deque[int]]:
if not node:
return []
if not node.children:
queue = deque()
queue.append(node.val)
return [queue]
# **
paths = itertools.chain.from_iterable(map(lambda ch: _visit(ch), node.children))
for p in paths:
p.appendleft(node.val)
return paths
return _visit(root)
如图所示,上面的代码返回一个空列表,其中所需的行为是
[deque([1,2,3])、deque([1,4])、deque([1,6])
。注意带**的行;如果我将该行重写为path=[p for ch in node.children for p in_visit(ch)]
,它将按预期工作。我猜问题是因为函数from_iterable
的计算是惰性的,但是当我迭代项目时,它不应该被强制计算吗?在尝试对每个项目执行appendleft
时,您正在耗尽链iterable。之后,路径
为空
您需要确保iterable只计算一次:
def ternary_tree_paths(root: TernaryNode) -> Iterable[Iterable[int]]:
def _visit(node: TernaryNode) -> Iterable[deque[int]]:
if not node:
return []
if not node.children:
queue = deque()
queue.append(node.val)
return [queue]
paths = itertools.chain.from_iterable(map(_visit, node.children))
retval = [] # to keep track of results
for p in paths: # iterate
p.appendleft(node.val)
retval.append(p) # add to result
return retval # return result
return _visit(root)
这将产生:
[deque([1, 2, 3]), deque([1, 4]), deque([1, 6])]
对于问题中的示例。如果您看到的是…@Julien,那就很好了。您的代码中没有定义实际的树。上面的代码是否显示了您的错误?不,没有。所以这不是一个简单的例子。我所说的只是提供一个可以复制和粘贴的例子,而不是期望人们自己从图片中编写代码。你当然没有义务像那些仍然试图帮助你的人那样友善。祝你愉快:)这回答了你的问题吗?谢谢似乎使用列表解决了这个问题,而不需要额外的列表
retval
。