用于展开/折叠的递归算法

时间:2016-12-10 20:25:51

标签: algorithm recursion data-structures

我试图为我的视图组件构建一种嵌套的行功能。数据可以嵌套到任意数量的级别。服务器以平面层次结构返回数据。例如,这就是数据集的外观:

[{"name":"A", "Level": 1}, 
{"name":"A.1", "Level": 2}, 
{"name":"A.2", "Level": 2},
{"name":"A.2.1", "Level": 3},
{"name":"A.2.2", "Level": 3},
{"name":"B", "Level": 1}, 
{"name":"B.1", "Level": 2}, 
{"name":"B.2", "Level": 2},
{"name":"B.2.1", "Level": 3},
{"name":"B.3", "Level": 2}]

该行的子项继续运行,直到遇到相同或数字较低级别的另一行或我们已用尽行数。例如,A的孩子继续直到遇到B,即Level = 1的下一行。同样,A.2(2级)的孩子继续,直到数字较低,即遇到B行的1级。

我想为用户提供一种功能,将层次结构切换到他/她可能想要的任何级别。 因此,如果用户点击"等级1"切换时,数据应显示为:
| A
|乙

同样,对于第2级,它应显示为:
| A
 | A.1
 | A.2
|乙
 | B.1
 | B.2
 | B.3

我所做的是,每当折叠一行时,我会从数据集中切割该行的子项,并将它们添加到该行的子属性中。 因此,如果A.2折叠,数据集将如下所示:

[{"name":"A", "Level": 1}, 
{"name":"A.1", "Level": 2}, 
{"name":"A.2", "Level": 2, "children": Array[2]},....so on]

用户还可以单独展开和折叠行。因此,例如,他可能会扩展A.2以显示3级,然后点击" 1级"切换。所以,这需要我首先折叠A.2行以隐藏其3级行,然后折叠A行以显示1级行。

在我的实现中,我目前对数组进行多次传递,首先将它从3级折叠到2然后2到1。同样,对于展开,我从1级到2级再进行2到3次多次传递。 我很难为此找到一个通过解决方案。如果解决方案也可以是恒定空间,那么这个数组可能会有点大,所以如果你可以删除空间约束并提供单遍算法,那么它仍然很好。

此外,如果有一种全新且更有效的方法,我会非常乐意实施它。 非常感谢!

0 个答案:

没有答案