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値のみを返します。

再帰でy​​ield-returnを使用し、Preorderの要素(この例ではA、B、C、D、E)を取得したいと思います。

(foreachの前にyield returnを配置すると、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 return前に置くだけforeachです。あなたは通常のreturnステートメントの振る舞いを考えています。

于 2012-02-03T09:53:46.140 に答える
3

各ノードalaの子のノードを明示的に反復してyieldreturnする必要があります。

        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 に答える