我试图弄清楚如何在树节点中实现一个函数,该节点返回其所有后代叶子(无论是直接还是间接).但是,我不想传递一个容器,其中叶子节点将递归放置(树可能很大),而是我想使用生成器迭代树.我尝试了一些方法,但到目前为止还没有一个方法.这是我最接近可能的解决方案:
public interface ITreeNode { IEnumerableEnumerateLeaves(); } 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将不起作用.
任何帮助将非常感谢.提前致谢.
编辑:我忘了提到一个分支可以有叶子或分支作为子,因此递归.
以下是如何实现Branch.EnumerateLeaves的方法:
public IEnumerableEnumerateLeaves() { foreach( var node in m_treeNodes ) { if( node is Leaf ) yield return node; else { foreach (ITreeNode childNode in node.EnumerateLeaves()) yield return childNode; } } }