C# 大树迭代

标签 c# algorithm recursion iteration tree-traversal

我有一个以父/子关系组装的大型结果集。我需要遍历树并将结果显示给用户。

我在使用递归之前已经完成了此操作,但由于我的结果集可能很大,我想避免接收 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/

相关文章:

c# - SQL 数据读取器 - 处理 Null 列值

c++ - 二叉搜索树前序遍历,递归与循环?

java - Java中使用递归的二叉搜索树

c# - 基于 XSD 创建多个类文件

c# - Entity Framework 核心过滤器 DbSet

C# 和 R.Net 不使用 ggplot2 显示任何图形

arrays - 简单的面试问题变得更难了 : given numbers 1. .100,找到恰好 k 丢失的缺失数字

java - 快速分解算法?

javascript - 递归检查树上的条件并在找到时停止

c# - 退出递归函数搜索子目录