假設我有一個表示嵌套集合層次結構的列表(示例在僞c#中)。如何將嵌套集有效轉換爲對象層次結構
class Node
{
public decimal left;
public decimal right;
public decimal id;
public void AddChild(Node child) {...}
...
}
List<Node> nodes = GetFlatNodesWithoutChildrenSetFromDatabase();
字段left
,right
和id
得到填補,因爲這些值存儲在數據庫中的一些。
什麼是將這個扁平列表轉換爲層次的有效方式,這意味着爲每個父節點填充適當的子節點?
一種方法是找到每個節點的所有祖先,對它們進行排序以找到父節點並將子節點添加到該節點。
foreach (var n in nodes)
{
var parent = nodes.Where(i => i.left < n.left && i.right > n.right).OrderBy(i => i.right - n.right).FirstOrDefault();
if (parent != null)
parent.AddChild(n);
}
但是這樣效率很低。
有沒有更好的(這意味着更快)的方法?
編輯
可能的解決方法(as suggested by Chris):
var stack = new Stack<Node>(nodes.Take(1));
foreach (var n in nodes.Skip(1))
{
while (stack.Peek().right < n.left)
stack.Pop();
stack.Peek().addChild(n);
stack.Push(n);
}
節點必須由left
訂購。
「左」和「右」在某種程度上代表孩子嗎? –
是的,我發現很難弄清楚你正在做什麼左右兩邊獲得父節點... – Chris
左和右是描述節點在嵌套集合中的位置的數字http:// en.wikipedia.org/wiki/Nested_set_model – sloth