Bonjour,
J'ai besoin de créer une API spécifique pour des ABR. L'ensemble fournit les résultats escomptés à l'exception de la suppression d'un nœud.
En effet, le nœud est supprimé et l'arbre réorganisé SAUF si le nœud demandé est le nœud racine, auquel cas je rentre dans une boucle infinie.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 typedef struct btree { int key; struct btree *left; struct btree *right; } *btree;La boucle infinie est signalée par un commentaire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67 static btree _btremove (btree tree, int key) { btree node = tree, *father = &tree; btree newnode, *newfather; while (node != NULL) { if (key == node->key) break; if (key < node->key) { father = &node->left; node = node->left; } else { father = &node->right; node = node->right; } } if (node != NULL) { if (node->left == NULL) { if (node->right == NULL) { *father = NULL; free (node); node = NULL; } else /* node->right != NULL */ { *father = node->right; free (node); node = NULL; } } else /* node->left != NULL */ { if (node->right == NULL) { *father = node->left; free (node); node = NULL; } else /* node->right != NULL */ /* we search the smaller value in the right tree */ { newnode = node->right; newfather = &node->right; while (newnode != NULL) { /* Si le nud demandé est la racine, boucle infinie ici ! */ if (newnode->left != NULL) { newfather = &newnode->left; newnode = newnode->left; } } node->key = newnode->key; *newfather = newnode->right; free (newnode); newnode = NULL; } } } return tree; }
Je ne comprends pas pourquoi le nœud à cet endroit est une fuille.
Pouvez-vous m'éclairer ?
Pb d'algo ?
Partager