Recentemente ho creato un albero rosso-nero in C # per capire meglio come funziona. Con esso, ho implementato un enumeratore in ordine, tuttavia mi sono subito reso conto che l'enumerazione di un albero può avere risultati distruttivi.
Considera questo codice:
RedBlackTree<Person> tree = new RedBlackTree<Person>();
tree.Add(new Person("Randy"));
// add more people
...
foreach(var person in tree)
{
if (person.Name == "Randy")
{
person.Name = "Cheeseburger eater";
}
}
L'albero richiede il parametro generico per implementare l'interfaccia IComparable
, al fine di determinare correttamente l'ordine degli articoli.
Se la classe Person
viene confrontata per nome, quindi, cambiando il nome durante l'enumerazione, è possibile che l'ordine sia stato interrotto. per esempio. randyNode.CompareTo(randyNode.Right) < 0
potrebbe essere false, che infrange la proprietà fondamentale del BST, che figlio sinistro è più piccolo del suo genitore e figlio destro più grande.
In questo caso, è meglio rimuovere del tutto l'enumerazione degli alberi, o dovrei tenerlo dentro, con un enorme avvertimento per non modificare gli elementi durante l'enumerazione?