如何将带重复次数的扁平化路径结构转换为嵌套结构?
如何将带重复次数的扁平化路径结构转换为嵌套结构?
看起来你需要把一组带重复次数的扁平路径,按照层级嵌套的规则展开成指定顺序的列表——父路径每次重复时,都要完整遍历并展开它的所有子路径的重复逻辑。这完全可以用递归实现,而且逻辑很清晰,我来给你拆解一下:
第一步:构建路径的树状结构
首先我们需要把扁平的路径转换成树,每个节点保存三个核心信息:
- 当前路径字符串
- 需要重复的次数
- 按输入顺序排列的子节点列表
构建这棵树的思路很简单,可以用一个哈希表(字典)来快速查找每个路径对应的节点:
- 遍历你的
List<Pair<Path,Integer>>,对每一对路径和次数:- 拆分出当前路径的父路径(比如
/a/d/e的父路径是/a/d,/a/d的父路径是/a) - 如果当前路径还没在哈希表中,就创建一个新节点,把路径、次数、空的子节点列表存进去
- 找到父路径对应的节点,把当前节点添加到它的子节点列表里(一定要保持输入顺序,这是输出正确的关键)
- 拆分出当前路径的父路径(比如
比如你的输入里,/a的子节点会按顺序是/a/b、/a/c、/a/d、/a/f、/a/g,而/a/d的子节点只有/a/d/e。
第二步:递归遍历树生成结果
有了树之后,递归逻辑就非常直观了:
我们写一个递归函数,传入一个节点,做两件事:
- 重复该节点指定的次数
- 每一次重复时,先输出当前节点的路径,然后递归遍历该节点的所有子节点(按顺序)
举个Python风格的伪代码例子:
class PathNode: def __init__(self, path, count): self.path = path self.count = count self.children = [] def generate_output(node, result): # 重复当前节点count次 for _ in range(node.count): # 添加当前路径到结果列表 result.append(node.path) # 按顺序递归遍历所有子节点 for child in node.children: generate_output(child, result)
用你的输入构建好树之后,调用generate_output(root_node, []),就能得到你想要的输出列表了。
如果不想用递归,迭代解法怎么做?
递归的逻辑其实可以转换成栈的迭代方式,适合担心递归深度过大的场景(不过你的路径层级一般不会太深,递归其实足够用):
我们用一个栈来保存待处理的节点和它剩余的重复次数。每次从栈顶取出元素:
- 如果剩余次数大于0:
- 先把当前节点的路径添加到结果
- 把当前节点重新压入栈,剩余次数减1
- 然后把该节点的所有子节点逆序压入栈(这样弹出时会保持原输入顺序),每个子节点的剩余次数是它的原始次数
- 如果剩余次数为0,就跳过这个节点
举个迭代的伪代码片段:
def generate_output_iterative(root_node): result = [] stack = [(root_node, root_node.count)] while stack: node, remaining = stack.pop() if remaining > 0: result.append(node.path) # 压回当前节点,次数减1 stack.append((node, remaining - 1)) # 逆序压入子节点,保证遍历顺序和输入一致 for child in reversed(node.children): stack.append((child, child.count)) return result
你可以根据自己使用的编程语言(比如Java用Stack类或者Deque)来调整这段逻辑,最终生成的结果和递归版本完全一致。
备注:内容来源于stack exchange,提问作者cobby
相关产品推荐
相关产品推荐

