【发布时间】:2014-11-24 10:35:31
【问题描述】:
问题
我有以下树:
2
/ \
3 5
/ / \
6 4 1
以下列方式和顺序表示:
id parent
------------
2 null
3 2
6 3
5 2
4 5
1 5
目的:
在O(n)中将这个扁平化的树存储在递归结构中(O(n*log(n))是可以接受的,但不是很好)(我知道如何在O(n^2),但我以 DFS 顺序存储数据以便能够以更有效的方式“解析”它)。例如:
class R {
int id;
List<R> children;
}
在 JSON 格式中看起来像这样:
{
id: 2,
children: [
{
id: 3,
children: { ... }
},
{
id: 5,
children: { ... }
}
]
}
如何我可以这样做?编程语言并不重要,因为我可以用 Java 翻译它。
Java 代码:
R r = new R();
Map<Long, Line> map = createMap2();
List<Line> vals = new ArrayList<Line>(map.values());
r.id = vals.get(0).id;
vals.remove(0);
r.children = createResource(vals, r.id);
...
private static List<R> createResource(List<Line> l, Long pid) {
List<R> lr = new ArrayList<R>();
if ( l.size() > 0 ) {
Long id = l.get(0).id;
Long p = l.get(0).pid;
l.remove(0);
if ( pid.equals(p) ) {
R r = new R();
r.id = id;
r.children = createResource(l, id);
lr.add(r);
}
else {
return createResource(l, pid); // of course, this is not ok
}
}
return lr;
}
上面代码中的问题是递归结构(R类)中只有2、3和6存储。我想将整个扁平树结构(许多 Line 对象)存储在那个 递归结构(R 对象)中,而不仅仅是一些节点。
P.S.:问题被简化了。我对特定的解决方案不感兴趣,因为涉及的领域很多,条目数以千计。我也对在最坏情况下(不同种类的树)工作良好的解决方案感兴趣,因为这是用户的保证。
【问题讨论】:
-
究竟有什么问题,您想将 id/parent 列表转换为有子节点的节点吗?此外,您的数据是否主要涉及平衡树?
标签: java algorithm recursion depth-first-search flatten