我有一個數據庫中的一些表的列表,其中每行包含引用另一行的父字段。這樣從根節點遍歷所有孩子的n-Tree
標題,父
A,空
B,A
C,A
d,C
E,B
女,空
在這裏,甲和F是根節點,B和C對A來說是子對象,D對C是子對象,E對B是子對象。
從這個列表中產生樹結構的最好方法是什麼?
一種方法是遍歷列表找到根(沒有父母的標題),然後爲每個根再次遍歷列表並附加根節點。然後,這些節點再次遍歷整個列表以附加他們自己的任何孩子。
例子:
private Node getNode(SomeData d) {
List<SomeData> tmp = getChildren(d);
if (tmp == null OR empty) return new Node(d);
Node n = new Node(d);
for (SomeData m : tmp) {
n.addChild(getNode(m)); // recurse
}
return n;
}
private List<SomeData> getChildren(SomeData parent) {
List<SomeData> tmp = new ArrayList<SomeData>();
for (SomeData candidateChild : myBigFlatDataList.values()) {
if (parent.equals(candidateChild)) {
tmp.add(candidateChild);
}
}
return tmp;
}
有沒有更好的方式來做到這一點?
我是這樣做的,但不能直接得到它,猜猜我今天太累了。 – rapadura 2010-10-06 17:56:55
是的有些數據中有equals和hashCode。 「child」來自parentnode.addChild(childNode)上方的第4行的位置; – rapadura 2010-10-07 07:40:43
@AntonioP:我修正了這個例子。它應該是「數據」。這個想法是,如果您可以根據它們包含的數據爲節點編制索引,則可以在O(1)時間內查找父節點,這意味着您可以在線性/ O(N)時間內構造整個樹。 – 2010-10-07 13:05:38