Я работаю над деревом AVL. Кажется, что само дерево работает, но мне нужен итератор для просмотра значений дерева. Поэтому я попытался реализовать взаимодействие IEnumerator. К сожалению, я получаю ошибку времени компиляции, реализующую IEnumerator и IComparable. Сначала код, а ниже - ошибка.
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;
//Build queue
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);
}
}
Ошибка от VS2008:
Ошибка 1 Тип «T» нельзя использовать в качестве параметра типа «T» в универсальном типе или методе «Opdr2_AvlTreeTest_Final.AvlTreeNode». Конвертирование или преобразование параметров типа из 'T' в 'System.IComparable' не выполняется.
Эта ошибка указана в следующих строках:
//members
private AvlTreeNode<T> current = default(T); //current highlighted
private AvlTreeNode<T> tree = null; //tree highlighted
private Queue<AvlTreeNode<T>> traverseQueue = null; //traverseQueue highlighted
//Constructor
public AvlTreePreOrderEnumerator(AvlTreeNode<T> tree) // AvlTreePreOrderEnumerator highlighted
//Method
private void visitNode(AvlTreeNode<T> node) //visitNode highlighted
Пока я не включил логику дерева и узла. Мне никто не думает, что нужно решать эту проблему, просто скажи!
Thx!