我正在尝试实现一个函数,它可以返回一个节点的所有后代叶子节点(无论是直接还是间接的)。但是,我不想递归地传递一个容器来存放叶子节点(树可能非常大),相反,我想使用生成器来遍历树。我已经尝试了几种方法,但迄今为止都没有成功。这个方法是我最接近可能解决问题的方法:
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也不起作用。
非常感谢任何帮助。提前致谢。
编辑:我忘记提到一个分支可以有叶子或分支作为子元素,因此需要递归。