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