Рекурсивный вывод бинарного дерева

При рекурсивном выводе бинарного дерева выводится только корень(_head). Как исправить ?

public class BinaryTree<T>: IEnumerable<T> where T : IComparable<T>
{
    private BinaryTreeNode<T> _head;
    private int _count;

    public IEnumerator<T> GetEnumerator()
    {
        return RevOrder(_head);
    }
    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
    
    private IEnumerator<T> RevOrder(BinaryTreeNode<T> node)
    {
        if (node == null)
            yield break;

        if (node.Left != null)
        {
            RevOrder(node.Left);
        }
        if (node.Right != null)
        {
            RevOrder(node.Right);
        }
            
        yield return node.Value;
    }

    public int Count { get { return _count; } }
}

Ответы (2 шт):

Автор решения: tym32167

Как вариант (проверьте сами, мне негде пока проверить)

public class BinaryTree<T> : IEnumerable<T> where T : IComparable<T>
{
    private BinaryTreeNode<T> _head;
    private int _count;

    public IEnumerator<T> GetEnumerator()
    {
        return RevOrder(_head).GetEnumerator();
    }
    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }

    private IEnumerable<T> RevOrder(BinaryTreeNode<T> node)
    {
        if (node == null)
            yield break;

        if (node.Left != null)      
            foreach(var n in RevOrder(node.Left)) yield return n;
        
        if (node.Right != null)
            foreach(var n in RevOrder(node.Right)) yield return n;
        
        yield return node.Value;
    }

    public int Count { get { return _count; } }
}
→ Ссылка
Автор решения: Stanislav Volodarskiy

Надо проитерироваться по поддеревьям и вывести их элементы. К сожалению, foreach отказыватеся работать с IEnumerator. Старый добрый while:

private IEnumerator<T> RevOrder(BinaryTreeNode<T> node)
{
    if (node == null)
        yield break;

    if (node.Left != null)
    {
        var it = RevOrder(node.Left);
        while (it.MoveNext()) {
            yield return it.Current;
        }
    }
    if (node.Right != null)
    {
        var it = RevOrder(node.Right);
        while (it.MoveNext()) {
            yield return it.Current;
        }
    }
        
    yield return node.Value;
}
→ Ссылка