树中带有yield return元素顺序的递归

时间:2012-02-03 09:51:07

标签: c# recursion tree yield-return postorder

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

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

    yield return subnode;
}

对于以下树结构:

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

当我尝试迭代时:

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

该函数仅返回A值。

我希望将yield-return与递归一起使用并检索Preorder中的元素(本例中为A,B,C,D,E)。

(如果我把收益率的回报放在foreach之前,那么foreach永远不会发生。)

这可能吗?

3 个答案:

答案 0 :(得分:16)

你有没有试过像:

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,但忽略其返回值。

答案 1 :(得分:3)

是的,可以将yield return放在foreach之前。您正在考虑正常return语句的行为。

答案 2 :(得分:1)

        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;
        }