kni*_*ght 2 c# generics algorithm binary-search-tree data-structures
我有一个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();
}
Run Code Online (Sandbox Code Playgroud)
我认为这部分代码就足够了.
这就是我定义BinaryTree类的方法:
public class BinaryTree<T> : IEnumerable<T> where T : IComparable<T>
Run Code Online (Sandbox Code Playgroud)
这就是我定义的方式BinaryTreeNode:
public class BinaryTreeNode<T> : IComparable<T> where T : IComparable<T>
Run Code Online (Sandbox Code Playgroud)
这是一种方法,使用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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
以下是使用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();
}
Run Code Online (Sandbox Code Playgroud)
编辑:既然你似乎有单独的类BinaryTree和BinaryTreeNode,你可以把两种以上的BinaryTreeNode,并把在以下BinaryTree:
public IEnumerator<T> GetEnumerator()
{
return Root.GetEnumerator();
}
Run Code Online (Sandbox Code Playgroud)