的問題與你的做法是,Data
可以是任何類型。您的設計允許您將多種類型放入同一棵樹中。所以一個節點可能有一個string
,另一個可能有一個double
,第三個可能有一個用戶定義類型的引用。如果您使Node
構造函數爲IComparable
實例,則假定樹中的所有項都是相同類型的,或者它們的IComparable
接口實現知道如何比較所有可能數據類型的值。
簡而言之,你所做的將會起作用,但它並不是安全的。
你有什麼是非常類似C的事情。在C++中,你會使用模板來避免這種憎惡。在C#中,您使用泛型。
我回應了在評論中提出的建議:如果你想要一個通用的數據結構,使通用數據結構。使用內置集合,例如,如果你想要一個整數列表你寫:
var list_of_integers = new List<int>();
如果你想字符串列表:
var list_of_strings = new List<string>();
如果你想創建一個通用樹集合,你下手:
public class MyGenericTree<T>
{
public class Node
{
public T Data;
public Node Left;
public Node Right;
public Node(T data)
{
Data = data;
}
}
private readonly IComparer<T> _comparer;
public MyGenericTree(IComparer<T> comparer = null)
{
_comparer = comparer ?? Comparer<T>.Default;
}
}
你與創建它:
var myTree = new MyGenericTree<string>(); // or int, or whatever type
如果你想有一個自定義的比較函數,你寫的:
// Create a tree that stores case-insensitive strings
var myTree = new MyGenericTree<string>(StringComparer.CurrentCultureIgnoreCase);
這迫使Data
永遠是一個兼容的類型。你要麼使用該類型的默認比較器,要麼使用傳遞給構造器的比較器接口。
,做比較時,它是:
int a = _comparer.Compare(node1, node2);
if (a < 0)
// node1 < node2
else if (a > 0)
// node1 > node2
else
// node1 == node2
如果你確實想在樹中存儲類型化object
引用,你可以隨便寫:
var myTree = new MyGenericTree<object>(some_object_comparer);
雖然你爲什麼會想做這樣的事情有點神祕。
我知道這個仿製藥看起來有點奇怪,但是在與他們合作一天之後,你就會明白它們非常靈活並且安全。
如果你想使樹通用,那麼你應該使用泛型!使它成爲一個類節點其中T:IComparable '並使用'公共T數據;'。然後你可以做'value.CompareTo(childPtr.Data)'。 –
Blorgbeard
當你說'value
@AlexanderDerck我用對象,所以我可以保持數據變量通用,所以樹會接受任何數據類型。 –