I am working on an AVL tree. The tree seems to work, but I need an iterator to go through the values of the tree. So I tried to implement IEnumerator interace. Unfortunately, I get a compile-time error that implements IEnumerator and IComparable. First enter the code and below that error.
class AvlTreePreOrderEnumerator<T> : IEnumerator<T> where T :IComparable<T>
{
private AvlTreeNode<T> current = default(T);
private AvlTreeNode<T> tree = null;
private Queue<AvlTreeNode<T>> traverseQueue = null;
public AvlTreePreOrderEnumerator(AvlTreeNode<T> tree)
{
this.tree = tree;
traverseQueue = new Queue<AvlTreeNode<T>>();
visitNode(this.tree.Root);
}
private void visitNode(AvlTreeNode<T> node)
{
if (node == null)
return;
else
{
traverseQueue.Enqueue(node);
visitNode(node.LeftChild);
visitNode(node.RightChild);
}
}
public T Current
{
get { return current.Value; }
}
object IEnumerator.Current
{
get { return Current; }
}
public void Dispose()
{
current = null;
tree = null;
}
public void Reset()
{
current = null;
}
public bool MoveNext()
{
if (traverseQueue.Count > 0)
current = traverseQueue.Dequeue();
else
current = null;
return (current != null);
}
}
Error provided by VS2008: Error 1 Type "T" cannot be used as a parameter of type "T" in the generic type or method "Opdr2_AvlTreeTest_Final.AvlTreeNode". There is no conversion of box conversion or conversion of type parameters from "T" to "System.IComparable".
This error is indicated on the following lines:
private AvlTreeNode<T> current = default(T);
private AvlTreeNode<T> tree = null;
private Queue<AvlTreeNode<T>> traverseQueue = null;
public AvlTreePreOrderEnumerator(AvlTreeNode<T> tree)
private void visitNode(AvlTreeNode<T> node)
node. , , !
!