gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:31:13 25 4
gpt4 key购买 nike

我有一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com