假设我有一个代表嵌套集层次结构的节点列表(示例在伪 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);
}
但这是相当低效的。
有没有更好(这意味着更快)的方法?
编辑
可能的解决方案(如 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
。