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

标签 c# algorithm generics data-structures binary-search-tree

我有一个 BinaryTree类和一个BinaryTreeNode对于持有节点,我已经制作了树并为它编写了前序、后序和中序方法。
但我不知道怎么写IEnumerator<T>为此(我只想对 GetEnumerator() 方法使用 in-order)。 问题是 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>

最佳答案

这是一种方法,使用 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();
}

编辑:因为您似乎有单独的类用于 BinaryTreeBinaryTreeNode,您可以将以上任何一个放在 BinaryTreeNode 中,并将以下内容放入 BinaryTree:

public IEnumerator<T> GetEnumerator()
{
    return Root.GetEnumerator();
}

关于c# - 如何为二叉搜索树编写 GetEnumerator()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27441558/

相关文章:

c# - 使用 NOT IN (SELECT ...) 时查询执行速度非常慢

algorithm - 动态编程硬币更改有限硬币

c# - Shim 和通用方法

python - 如何在大型稀疏矩阵中找到非零元素的索引?

java - 当方法参数是 <T> 或 <?> 或任何时,方法的泛型标识符的所有可能方式?

Java泛型键盘输入

java - 如何更好地创建复杂类的实例?

c# - 控制台模板应用程序 MediaCapture 无法录制视频

c# - 如何以编程方式将文件夹添加到用户的收藏夹(在 Windows 资源管理器中)?

c - 低内存条件下的 LZW 压缩/解压缩