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();
}