Рекурсия с порядком возврата элементов в дереве - PullRequest
9 голосов
/ 03 февраля 2012

У меня есть рекурсивная функция, которая возвращает все узлы поддерева, учитывая начальный корневой узел.

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 с рекурсией и извлекать элементы в Предзаказе (в данном примере A, B, C, D, E).

(Если бы я поставил доходность перед foreach, foreach никогда бы не появился).

Возможно ли это?

Ответы [ 3 ]

16 голосов
/ 03 февраля 2012

Вы пробовали что-то вроде:

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 рекурсивно, но игнорирует возвращаемое значение.

3 голосов
/ 03 февраля 2012

Да, это возможно, просто поставьте yield return перед foreach.Вы думаете о поведении нормального return заявления.

1 голос
/ 14 августа 2016
        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;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...