当前位置:  开发笔记 > 编程语言 > 正文

如何使用生成器迭代树结构?

如何解决《如何使用生成器迭代树结构?》经验,为你挑选了1个好方法。

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

    public interface ITreeNode
    {
        IEnumerable EnumerateLeaves();            
    }

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

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

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

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

任何帮助将非常感谢.提前致谢.

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



1> angry person..:

以下是如何实现Branch.EnumerateLeaves的方法:

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

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有