我在父/子关系中组装了一个大的结果集。我需要走树并将结果显示给用户。
我在使用递归之前已经完成了这个,但是因为我的结果集可能很大,所以我想避免接收StackOverflowException的可能性。
我在使用堆栈的MSDN上发现了以下example。我遇到的问题是因为堆栈是先进先出,我的数据没有正确显示。我希望它看起来如下:
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);
}
}
}
}
答案 0 :(得分:3)
在当前的算法中,您首先要找到合适的孩子。
让它先成为孩子。多数民众赞成。
例如,在您的代码中可能有类似的内容:
node = node.rightChild()
将其更改为
node = node.leftChild()
这是解决此类问题的一般方法。
由于MSDN实现没有公开这种代码,我无法对此发表评论。
答案 1 :(得分:1)
以相反的顺序将您的物品推入堆叠,即在1之前的2。
示例:
// suppose I want to push children[] onto the stack
for (int i = children.Length - 1; i >= 0; i--)
{
stack.Push(children[i]);
}
要在代码中执行此操作,请尝试以下for-each
语句:
foreach (DataRowView drvChild in dv.Reverse())
答案 2 :(得分:0)
如果它只是提供问题的排序,请从使用堆栈更改为使用队列。它们在实际应用中是相同的,区别在于队列是先进先出。
答案 3 :(得分:0)
通过以相反的顺序更改子节点的迭代,它们显示为所需
//Add child nodes to the stack
for (int i = dv.Count - 1; i >= 0; i--)
{
DataRowView drvChild = dv[i];
Item item = new Item();
item.Text = drvChild["Text"].ToString();
item.ID = drvChild["ID"].ToString();
item.ParentID = drvChild["ParentID"].ToString();
itemTree.Push(item);
}