11

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

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 将永远不会发生)。

这可能吗?

4

3 回答 3

17

您是否尝试过类似的方法:

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递归调用,但忽略它的返回值。

于 2012-02-03T10:15:43.977 回答
3

是的,这是可能的,只需yield returnforeach. 您正在考虑正常return语句的行为。

于 2012-02-03T09:53:46.140 回答
3

您需要显式迭代 + yield 返回每个节点ala的子节点:

        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;
        }
于 2016-08-14T11:40:34.550 回答