Modifié:
Ce code supprime le nœud de l'arbre, mais ne retourne pas:
private void Remove(Node n, int e)
{
if (n == null)
return;
if (e > n.Element) {
if (e == n.Right.Element)
n.Right = null;
else
Remove(n.Right, e);
} else {
if (e == n.Left.Element)
n.Left = null;
else
Remove(n.Left, e);
}
}
Ce code renvoie également le nœud:
private Node Remove(Node n, int e)
{
if (n == null)
return null;
if (e > n.Element) {
if (e == n.Right.Element) {
Node res = n.Right;
n.Right = null;
return res;
} else
return Remove(n.Right, e);
} else {
if (e == n.Left.Element) {
Node res = n.Left;
n.Left = null;
return res;
} else
return Remove(n.Left, e);
}
}
Quel était le problème avec le code d'origine:
Imaginez que les points de bsTree à l'arbre suivant:
5
1 7
Nous maintenant nommer les nœuds a
, b
, et c
, de sorte qu'ils contiennent les valeurs 5, 1 et 7, respe ctively, comme
a
b c
a.Left
pointe maintenant à b
et a.Right
des points à c
.
Désormais, nous souhaitons supprimer le noeud contenant 1, c'est-à-dire le noeud b
. Pour ce faire, il faut changer l'arbre, de sorte que a.Left
est null
et l'arbre ressemblera à ceci:
5
7
Maintenant, nous passons par l'étape de code d'origine par étape.Tout d'abord:
Node x = bsTree.Find(1);
x
est déclarée et pointe désormais au nœud b
. L'arbre est inchangé.
x = null;
x
est maintenant définie sur null, mais a.Left
pointe encore des points à b
. L'arbre est toujours inchangé.
bsTree.Print();
Nous avons maintenant imprimé l'arbre.
un bref commentaire: vous n'avez pas besoin « ref » dans le prototype de votre méthode – PierrOz
une chose qui manque est évidemment le paramètre « nœud à la procédure adoptée en .Find par 'ref. – BillW