C# 如何为二叉搜索树编写GetEnumerator()?

C# 如何为二叉搜索树编写GetEnumerator()?,c#,algorithm,generics,data-structures,binary-search-tree,C#,Algorithm,Generics,Data Structures,Binary Search Tree,我有一个BinaryTree类和一个BinaryTreeNode用于保存节点,我已经创建了树,并为它编写了pre-order、post-order和order方法。 但是我不知道如何为它编写IEnumerator(我只想为GetEnumerator()方法使用)。 问题是,inoder方法的返回类型是void。我想让它IEnumerator而不是MessageBox返回数据 我该怎么做 public void PreOrder(BinaryTreeNode<T> node) {

我有一个
BinaryTree
类和一个
BinaryTreeNode
用于保存节点,我已经创建了树,并为它编写了pre-order、post-order和order方法。
但是我不知道如何为它编写
IEnumerator
(我只想为
GetEnumerator()
方法使用)。 问题是,
inoder
方法的返回类型是
void
。我想让它
IEnumerator
而不是
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();
}
这就是我如何定义BinaryTreeNode的:

public class BinaryTreeNode<T> : IComparable<T> where T : IComparable<T>
public类BinaryTreeNode:IComparable其中T:IComparable

这里有一种方法,使用
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;
        }
    }
}

我在BinaryTree中没有左属性。它是二叉树型的。GetEnumerator()位于BinaryTree中。所以左,右在这里不起作用。你想看完整的代码吗?
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;
        }
    }
}
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();
}
public IEnumerator<T> GetEnumerator()
{
    return Root.GetEnumerator();
}