Как написать GetEnumerator () для бинарного дерева поиска?

1

У меня есть класс BinaryTree и BinaryTreeNode для хранения узлов, я уже создал дерево и написал для него предварительный порядок, порядок послепорядка и порядок заказа.
но я не знаю, как написать IEnumerator<T> для него (я только хочу использовать in-order для метода GetEnumerator()). Проблема заключается в том, что возвращаемый тип метода inOrder void. Я хочу сделать это IEnumerator<T> и вместо возвращаемых данных MessageBox.

Как я могу это сделать?

public void PreOrder(BinaryTreeNode<T> node)
{
    if (node != null)
    {
        MessageBox.Show(node.Value.ToString());
        PreOrder(node.Left);
        PreOrder(node.Right);
    }
}

public void PostOrder(BinaryTreeNode<T> node)
{
    if (node != null)
    {
        PostOrder(node.Left);
        PostOrder(node.Right);
        MessageBox.Show(node.Value.ToString());
    }
}

public void InOrder(BinaryTreeNode<T> node)
{
    if (node != null)
    {
        InOrder(node.Left);
        MessageBox.Show(node.Value.ToString());
        InOrder(node.Right);
    }
}

public void Clear()
{
    root = null;
    Count = 0;
}

public IEnumerator<T> GetEnumerator()
{
    InOrder(root);
    return null; // error in forerach loop
}

IEnumerator IEnumerable.GetEnumerator()
{
    return GetEnumerator();
}

Я думаю, что этой части моего кода достаточно.
Вот как я определил класс BinaryTree:

public class BinaryTree<T> : IEnumerable<T> where T : IComparable<T>

и вот как я определил BinaryTreeNode:

public class BinaryTreeNode<T> : IComparable<T> where T : IComparable<T>
Теги:
generics
algorithm
data-structures
binary-search-tree

1 ответ

5
Лучший ответ

Вот один из способов сделать это, используя yield:

public IEnumerator<T> GetEnumerator()
{
    if (Left != null)
    {
        foreach(var v in Left)
        {
            yield return v;
        }
    }

    yield return Value;

    if (Right != null) 
    {
        foreach (var v in Right)
        {
            yield return v;
        }
    }
}

И вот более сжатый подход с использованием Linq:

public IEnumerator<T> GetEnumerator()
{
    var leftEnumerable = (IEnumerable<T>)Left ?? new T[0];
    var rightEnumerable = (IEnumerable<T>)Right ?? new T[0];

    return leftEnumerable.Concat(new T[] { Value })
                         .Concat(rightEnumerable)
                         .GetEnumerator();
}

Изменить. Поскольку у вас, кажется, есть отдельные классы для BinaryTree и BinaryTreeNode, вы можете поместить любой из указанных выше в BinaryTreeNode и поместить следующее в BinaryTree:

public IEnumerator<T> GetEnumerator()
{
    return Root.GetEnumerator();
}
  • 0
    У меня нет свойства Left в BinaryTree. это в BinaryTreeNode. и GetEnumerator () находится в BinaryTree. Так что Левый и Правый здесь не работают. Хотите увидеть полный код?
  • 0
    @ Knight Пожалуйста, смотрите мой выше редактирования.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню