我想弄清楚如何在树节点中实现一个函数,该树节点返回其所有后代树叶(不管是直接的还是间接的)。但是,我不想传递一个容器,其中叶节点将递归(树可能很大),而是我想使用生成器遍历树。我尝试了一些方法,但目前为止它们都没有工作。这一个是最接近我已经来到一个可能的解决方案:如何使用生成器遍历树结构?
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将不起作用。
任何帮助将非常感激。提前致谢。
编辑:我忘了提及一个分支可以有叶或分支作为孩子,因此递归。
这不是一个.NET的问题吗? – 2008-12-30 22:07:23
是 - 已被重新标记。编程站点上的“编程”标签是多余的。 =) – 2008-12-30 22:09:20