Двоичный обход дерева поиска - предварительный заказ

Я пытаюсь реализовать предварительный заказ обхода дерева, используя yield return, который возвращает IEnumerable

private IEnumerable<T> Preorder(Node<T> node)
{

    while(node != null)
    {
        yield return node.Data;
        yield return node.LeftChild.Data;
        yield return node.RightChild.Data;
    }

}

В этом случае он переходит в бесконечный цикл, и да, я знаю, что мне нужно продолжай пересекать. Как это можно сделать?

Если LeftChild или RightChild имеет значение NULL, выдает исключение NULL. Я думаю, что в этот момент мне понадобится yield break;

Я полагаю, inorder и postorder тоже будут похожи, есть идеи?

У меня есть Resursive версия, которая работает хорошо.

public void PreOrderTraversal(Node<T> node)
{

    if(node!=null)
    {
        Console.Write(node.Data);
    }
    if (node.LeftChild != null)
    {
        PreOrderTraversal(node.LeftChild);
    }

    if (node.RightChild != null)
    {
        PreOrderTraversal(node.RightChild);
    }
}

Спасибо.

8
задан DarthVader 4 June 2011 в 02:42
поделиться