关于c#:在树中使用yield return elements order的递归

Recursion with yield return elements order in tree

我有一个递归函数,返回给定起始根节点的所有子树节点。

1
2
3
4
5
6
7
private IEnumerable<Node> getAllNodesRecursively(Node subnode)
{
    foreach (Node node in subnode.Nodes)
        getAllNodesRecursively(node);

    yield return subnode;
}

对于以下树结构:

1
2
3
4
5
6
7
8
9
A
|
+--B
|
+--C
|  |
|  +--D
|
+--E

当我尝试这样迭代时:

1
2
3
4
foreach (Node n in getAllNodesRecursively(a))
{
    Console.WriteLine(n);
}

函数只返回A值。

我希望将yield-return与递归结合使用,并在预订单中检索元素(本例中为a、b、c、d、e)。

(如果我把收益率放在前臂之前,前臂就永远不会发生了)。

这有可能吗?


您是否尝试过类似的操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
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;
        }
    }
}

您的实现以递归方式调用getAllNodesRecursively,但忽略了它的返回值。


是的,有可能,把yield return放在foreach之前。你在考虑一个正常的return声明的行为。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        public IEnumerable<int> preOrder(Node root)
        {
            if (root == null)
                yield break;

            yield return root.val;

            if (root.left != null)
                foreach (int i in preOrder(root.left))
                    yield return i;

            if (root.right != null)
                foreach (int i in preOrder(root.right))
                    yield return i;
        }