作业求助:树形结构叶子路径提取中如何生成list of lists?
嘿,这个问题其实在树的路径遍历场景里超常见的,完全不用自己从零实现复杂的列表组合逻辑!我给你两种常用的思路,不管你用递归还是迭代,都能轻松搞定这个list of lists的收集~
递归回溯法(最经典的树遍历思路)
这种方法的核心是维护一个「当前路径」的列表,遍历到叶子节点时,把这个路径的独立副本加入结果列表就行。这里的关键是要做回溯——走完一条分支后,把路径里的最后一步删掉,再走另一条分支。
比如用Python实现的话,代码大概是这样的:
def find_leaf_paths(root): # 初始化结果列表,用来存所有叶子路径 result = [] # 定义递归辅助函数,参数是当前节点和当前路径 def dfs(node, current_path): if not node: return # 遇到叶子节点(左右子节点都为空) if not node.left and not node.right: # !这里就是你要填的「问号位置」操作:把当前路径的副本加入结果 result.append(current_path.copy()) return # 走左分支,路径加0 current_path.append(0) dfs(node.left, current_path) current_path.pop() # 回溯:退出左分支时,把最后一步删掉 # 走右分支,路径加1 current_path.append(1) dfs(node.right, current_path) current_path.pop() # 回溯:退出右分支时,把最后一步删掉 # 从根节点开始,初始路径为空 dfs(root, []) return result
这里要注意:绝对不能直接把current_path加到result里,因为它是一个列表引用——后续回溯的pop操作会修改它的内容。必须存它的副本(比如copy()或者切片current_path[:]),这样每个叶子的路径都是独立的列表,不会互相干扰。
迭代栈方法(不用递归的实现)
如果你不想用递归,也可以用栈来模拟遍历过程。栈里存「当前节点 + 当前路径」的元组,每次处理节点时,直接生成新的路径列表(不用手动回溯),遇到叶子就把路径加入结果。
代码示例:
def find_leaf_paths(root): if not root: return [] result = [] # 栈里初始放根节点和空路径 stack = [(root, [])] while stack: node, current_path = stack.pop() # 遇到叶子节点,直接把当前路径加入结果 if not node.left and not node.right: result.append(current_path) continue # 栈是后进先出,所以先压右节点(让左节点先被处理) if node.right: # 生成新的路径:原路径 + [1],不用修改原路径 stack.append((node.right, current_path + [1])) if node.left: # 生成新的路径:原路径 + [0] stack.append((node.left, current_path + [0])) return result
这种方法更直观,因为每次压栈时都是创建一个新的路径列表,完全不用管回溯,每个路径都是独立的,直接收集就行。
总结一下
你根本不需要找什么现成的「组合多个列表」的工具,核心逻辑就是:在遍历到叶子节点时,把当前路径的独立副本收集到结果列表中。不管用递归回溯还是迭代生成新路径,都是围绕这个思路来的,选你觉得符合自己函数结构的方式加代码就行~
内容的提问来源于stack exchange,提问作者Phil Cho
相关产品推荐
相关产品推荐

