我有一个以父/子关系组装的大型结果集。我需要遍历树并将结果显示给用户。
我在使用递归之前已经完成了此操作,但由于我的结果集可能很大,我想避免接收 StackOverflowException 的可能性。
我发现了以下example MSDN 上使用了 Stack。我遇到的问题是因为堆栈是后进先出,所以我的数据无法正确显示。我希望它看起来像下面这样:
LeveL 1
Level 1.1
Level 1.1.1
Level 1.1.2
Level 1.2
Level 1.2.1
Level 1.2.2
但看起来像:
LeveL 1
Level 1.2
Level 1.2.2
Level 1.2.1
Level 1.1
Level 1.1.2
Level 1.1.1
有什么想法吗?
这是我的代码示例。假设DataTable dt
具有以下列:ID、ParentID和Text
private struct Item
{
public string Text;
public int ID;
public int ParentID;
}
private void BuildView()
{
Stack<Item> itemTree = new Stack<Item>(40);
//Get All Parent Nodes
DataView dv = new DataView(dt);
dv.RowFilter = "ParentID = 0";
//Add the parent nodes to the stack
foreach (DataRowView drv in dv)
{
Item item = new Item();
item.Text = drv["Text"].ToString();
item.ID = drv["ID"].ToString();
item.ParentID = drv["ParentID"].ToString();
itemTree.Push(item);
}
//Go through the stack one node at a time
while (itemTree.Count > 0)
{
Item currentItem = itemTree.Pop();
Debug.WriteLine(currentItem.Text);
//Get children of current node
dv.RowFilter = String.Format("ParentID = {0}", currentItem.ID);
if (dv.Count > 0)
{
//Add child nodes to the stack
foreach (DataRowView drvChild in dv)
{
Item item = new Item();
item.Text = drvChild["Text"].ToString();
item.ID = drvChild["ID"].ToString();
item.ParentID = drvChild["ParentID"].ToString();
itemTree.Push(item);
}
}
}
}
最佳答案
在当前的算法中,您首先要选择正确的 child 。
首先将其设置为左子项。仅此而已。
例如,在您的代码中可能有类似以下内容:
node = node.rightChild()
更改为
node = node.leftChild()
这是此类问题的通用解决方案。
由于 MSDN 实现没有公开此类代码,因此我无法对此发表评论。
关于C# 大树迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/508280/