.net - 如何使用生成器遍历树结构?

标签 .net recursion iterator generator yield

我试图弄清楚如何在树节点中实现一个函数,该函数返回其所有后代叶子(无论是直接的还是间接的)。但是,我不想传递将递归放置叶节点的容器(树可能很大),而是想使用生成器遍历树。我尝试了几种方法,但到目前为止都没有奏效。这是我最接近可能的解决方案:

    public interface ITreeNode
    {
        IEnumerable<ITreeNode> EnumerateLeaves();            
    }

    class Leaf : ITreeNode
    {
        public IEnumerable<ITreeNode> EnumerateLeaves()
        {
            throw new NotImplementedException();
        }
    }

    class Branch : ITreeNode
    {
        private List<ITreeNode> m_treeNodes = new List<ITreeNode>();

        public IEnumerable<ITreeNode> EnumerateLeaves()
        {
            foreach( var node in m_treeNodes )
            {
                if( node is Leaf )
                    yield return node;
                else
                    node.EnumerateLeaves();
            }
        }
    }

但这也行不通。我究竟做错了什么?如果在同一个函数中有一个 yield 语句,似乎递归调用 .EnumerateLeaves 将不起作用。

任何帮助将不胜感激。提前致谢。

编辑:我忘了提到一个分支可以有叶子或分支作为 child ,因此递归。

最佳答案

以下是您应该如何实现 Branch.EnumerateLeaves:

public IEnumerable<ITreeNode> EnumerateLeaves()
{
    foreach( var node in m_treeNodes )
    {
        if( node is Leaf )
            yield return node;
        else
        {
            foreach (ITreeNode childNode in node.EnumerateLeaves())
                yield return childNode;
        }
    }
}

关于.net - 如何使用生成器遍历树结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/401432/

相关文章:

Javascript匿名函数错误

php - 递归是否基本上到达 "stack"的底部然后反弹回来?

java - 如何从具有子列表的列表中获取值并将所有值按顺序存储在另一个列表中

python - 将生成器转换为迭代器类的最佳方法

.Net 中继器等效于单个对象?

.net - 动态代理生成速度

c# - 从枚举中获取值

.net - 如何在 .NET 中使用以编程方式设置的 alpha channel 绘制图像?

java - 为什么 `.hasNext()` 消耗 `BufferedReader` 中的元素?

c++ - 在 std::map 中迭代 std::vector