我有一个BinaryTree
类和一个BinaryTreeNode
用于保存节点,我已经创建了树并编写了预订,后序和按顺序方法它。
但我不知道如何为它编写IEnumerator<T>
(我只想对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>
答案 0 :(得分: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();
}