建立档案路径树
问题描述:
我试图创建的文件路径,它可以添加和删除dinamically树视图,例如:建立档案路径树
A/B/C/D/file1.txt
A/B/D/E/file2.txt
A/B/D/G/file3.txt
A/B/D/G/file4.txt
我的树,然而,有一个要求,即路径没有子项目(文件)应该在一个节点中折叠。对于上面的路径会产生:
A/B
|---C/D
file1.txt
|---D
|---E
| file2.txt
|---G
file3.txt
file4.txt
有什么想法?创建树很容易,但我无法摆脱这种额外的条件......我想我必须使用某种递归,因为我添加项目并打破路径,因为我们发现某个路径有更多的子项(然后递归地做同样的事情?)。我应该使用某种类型的trie吗?当相同的路径可以有多个文件时它工作吗?......谢谢!
答
让我们先来一个简单的解决方案来打印树,因为它实际上是:
function browseTree(node)
{
// ...print node...
// Visit recursively the children nodes:
for (var child: node.children)
{
browseTree(child);
}
}
现在,让我们修改为“缩短”单文件夹路径:
function browseTree(node)
{
// Before printing, accumulate as many straight folders as possible:
var nodeName=node.name
while (hasJustOneFolder(node))
{
// This loop steps deeper in the tree:
node=node.children[0]
nodeName+="/"+node.name;
}
// ...print node...
// Last, visit recursively the non-unique children nodes:
for (var child: node.children)
{
browseTree(child);
}
}
function hasJustOneFolder(node)
{
return node.children.length==1 && node.children[0].isFolder();
}
答
鉴于你要求,似乎向C中添加一个新文件并不意味着递归操作。
如果添加file5.txt
到文件夹C,你必须有2名儿童C
节点改造C/D
:file5.txt
和一个叫D
新节点。 D
将与旧节点C/D
具有相同的子节点。然后您可以擦除节点C/D
。
但是,这不会影响节点A/B
,因为文件夹A仍然只有一个文件夹(B)作为子项。因此,您可以解决仅进行本地更改的问题。
我认为你应该像平常一样构建树,并让你的UI处理额外的条件,这可能更容易分裂这些需求;) – Icepickle
不幸的是,我不能。 –