Kornelije Petak Kornelije Petak - 3 months ago 23
C# Question

Recursion with yield return elements order in tree

I have a recursive function that returns all subtree nodes, given the starting root node.

private IEnumerable<Node> getAllNodesRecursively(Node subnode)
{
foreach (Node node in subnode.Nodes)
getAllNodesRecursively(node);

yield return subnode;
}


For the following tree structure:

A
|
+--B
|
+--C
| |
| +--D
|
+--E


When I try to iterate as such:

foreach (Node n in getAllNodesRecursively(a))
{
Console.WriteLine(n);
}


the function returns the only the A value.

I wish to use yield-return with recursion and retrieve elements in the Preorder (A, B, C, D, E in this example).

(If I put the yield return before the foreach, the foreach would never happen).

Is this possible?

Joe Joe
Answer

Have you tried something like:

private IEnumerable<Node> getAllNodesRecursively(Node subnode) 
{ 
    // Return the parent before its children
    yield return subnode; 

    foreach (Node node in subnode.Nodes) 
    {
        foreach(Node n in getAllNodesRecursively(node))
        {
            yield return n;
        }
    }
} 

Your implementation is calling getAllNodesRecursively recursively, but ignoring its return value.

Comments