如何仅打印递归函数中找到的文件的文件树?

Posted

技术标签:

【中文标题】如何仅打印递归函数中找到的文件的文件树?【英文标题】:How to print the file tree of only the found files in a recursive function? 【发布时间】:2021-03-30 10:47:24 【问题描述】:

我有一个递归函数,可以搜索给定文件名的路径。我要做的是打印匹配的文件及其父目录。

所以对于这样的文件树:

mydir
   mysubdir
       mysubsubdir
           file1
           file2
   file1
   mysubdir2
       file2

我想在搜索 file1 时打印这个:

mydir
    mysubdir
        mysubdir
            file1
    file1

我能够看到每个找到的文件的路径,所以我想从这些路径构建一棵新树,然后打印该树,但在我看来,必须有一个更简单的方法。

【问题讨论】:

你能展示你的功能吗? 递归函数返回给它的调用者什么? @wildplasser 找到文件时返回 1。 【参考方案1】:

您的函数需要从根目录到您正在处理的当前目录的路径。例如,通过const char ** 参数,并在每次下降目录时附加到目录(如果您不喜欢recalloc 或确保预先确保足够大的大小,则为链表)。当匹配时,您可以打印从根开始的路径(但请参见下文)。

要获得 mydir/file1 的快捷行为,您需要之前匹配的路径。这可能是另一个const char ** 论点。打印规则现在被细化为缩进与先前匹配和当前匹配具有公共路径元素一样多的级别,然后从当前匹配打印剩余的唯一路径。这意味着深度优先搜索和按排序顺序访问子目录。

您也可以在 const char *** 或 @wildplasser 建议的树中记录每个匹配项,而不是随手打印。然后使用相同的改进打印算法循环/遍历结果(如果您使用树,您只需要知道级别而不是前缀路径)。如果您不进行深度优先搜索,您可以使用这种方法对数组进行排序。如果你使用树来存储结果,你会先走深度。

【讨论】:

只有上一个匹配的路径就足以避免多次打印某些目录吗? 你能想出一个反例吗?这意味着您当前的比赛与您在上一场比赛之前打印出来的路径有一些共同点,而不是上一场比赛。我肯定是错的。 @LonelyBishop 您要么需要两次通过,要么存储收集到的信息(在树状结构中)并在 遍历树之后进行打印。 @AllanWind 在您提到的第二种方法中:我应该如何在指针中记录每个匹配项?如果我存储每个路径的完整路径,我不应该创建一个新树来正确打印它们吗?对于后续问题,我们深表歉意。 遍历排序路径列表相当于先遍历树深度,同时按排序顺序访问子目录。关键是有一个共享变量,所有结果都存储在其中。这很容易通过传递一个参数来完成。

以上是关于如何仅打印递归函数中找到的文件的文件树?的主要内容,如果未能解决你的问题,请参考以下文章

在递归二叉树函数中返回元组时遇到问题

PHP如何在递归函数中计算嵌套调用的级别?

带有尾递归函数c ++的堆栈溢出

如何在 Python 中没有任何循环(例如:for、while 等)递归 JSON 文件

实现递归 Void 函数(查找二叉搜索树的高度)

如何在目录树中递归查找和替换所有出现的字符串? [复制]