Я пытаюсь выяснить, как реализовать функцию в узле дерева, которая возвращает все его потомки (прямые или косвенные). Однако я не хочу передавать контейнер, в котором листовые узлы будут размещаться рекурсивно (дерево может быть огромным), вместо этого я хотел бы использовать генератор для итерации по дереву. Я попробовал несколько подходов, но ни один из них не работал до сих пор. Это самое близкое из возможных решений:
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();
}
}
}
Но это тоже не работает. Что я делаю неправильно? Похоже, что вызов .EnumerateLeaves рекурсивно не будет работать, если в той же функции есть оператор yield.
Любая помощь будет принята с благодарностью. Заранее спасибо.
Редактировать: Я забыл упомянуть, что ветвь может иметь либо листья, либо ветви как дочерние элементы, отсюда и рекурсия.