我正在研究AVL树。树本身似乎正在工作,但我需要一个迭代器来遍历树的值。因此我尝试实现IEnumerator interace。不幸的是,我遇到了一个实现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”不能用作泛型类型或方法“Opdr2_AvlTreeTest_Final.AvlTreeNode”中的类型参数“T”。从'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!
答案 0 :(得分:2)
您可以尝试将其更改为此
class AvlTreePreOrderEnumerator<T> : IEnumerator<T> where T :IComparable
答案 1 :(得分:2)
我怀疑你将节点类声明为:
public class AvlTreeNode<T> where T : IComparable<AvlTreeNode<T>> {
public AvlTreeNode<T> Root;
public AvlTreeNode<T> LeftChild {get;set;}
public AvlTreeNode<T> RightChild {get;set;}
public T Value { get; set;}
}
试试这个(更改了IComparable参数类型):
public class AvlTreeNode<T> where T : IComparable<T> {
public AvlTreeNode<T> Root;
public AvlTreeNode<T> LeftChild {get;set;}
public AvlTreeNode<T> RightChild {get;set;}
public T Value { get; set;}
}
您还必须将current
字段更改为:
private AvlTreeNode<T> current = new AvlTreeNode<T>();
答案 2 :(得分:1)
虽然您尚未发布导致错误(Opdr2_AvlTreeTest_Final.AvlTreeNode
)的实际代码,但我强烈怀疑问题是您在通用方法/类型中使用此类且类型参数不受约束实施IComparable<T>
。
您可以使用一个简单示例重现类似的错误:
// no problem here at definition site:
void IsLarger<T>(T a, T b) where T : IComparable<T> {
return a.CompareTo(b) > 0;
}
void Test<T>(T arg) { // note: T is not necessarily IComparable<T>
Console.WriteLine(IsLarger(arg, arg)); // The compiler shouldn't allow this.
}
答案 3 :(得分:1)
正如已经指出的那样,你没有包含所有代码,但是你只将T限制为IComparable&lt; T&gt;,而你列出的错误是它想要T实现IComparable(即非泛型形式) IComparable)