Aller au contenu

TNSI : Arbres Binaires de Recherche (ABR)⚓︎

Def

  • Un Arbre Binaire de Recherche (ABR) 🇫🇷, ou Binary Search Tree (BST) 🇬🇧, est un Arbre Binaire tel que :
    • les clés du sous-arbre gauche sont inférieures ou égales à celle de la racine
    • les clés du sous-arbre droit sont supérieures ou égales à celle de la racine
    • les deux sous-arbres sont eux-mêmes des Arbres Binaires de Recherche
  • Les Clés d'un Arbre Binaire de Recherche sont ses étiquettes

Remarque : L'égalité est ici possible pour le sous-arbre gauche (le sous-arbre droit a des clés strictement supérieures), mais on pourrait tout aussi bien faire le contraire.

Cas de Figure ABR⚓︎

Arbres Binaires de Recherche (ABR)⚓︎

ABR2020151520--15242420--247715--7v115--v124--v1363624--36282836--28383836--38
Arbre Binaire
de Recherche
ABR55445--416165--16224--2v14--v1101016--10202016--207710--7141410--14121214--12151514--15
Arbre Binaire
de Recherche
ABR2424131324--13272724--278813--8171713--17v127--v1323227--32151517--15222217--22282832--28v232--v2
Arbre Binaire
de Recherche
ABR5050161650--16707050--708816--8252516--25525270--52v470--v4v28--v215158--15191925--19v125--v1131315--13v315--v3v552--v5686852--68646468--64v668--v6
Arbre Binaire
de Recherche
ABR2020141420--14232320--238814--8v114--v123--v1252523--25448--412128--12101012--10v312--v39910--9111110--11v2
Arbre Binaire
de Recherche
ABR4040353540--35606040--60303035--30373735--37202030--20343430--34101020--10v120--v15510--5v210--v2
Arbre Binaire
de Recherche

Non ABR. Justifiez⚓︎

ABR2020151520--15383820--387715--7v115--v1363638--36v238--v2282836--28393936--39
Pas un ABR
ABR55445--416165--16224--2v14--v1101016--10202016--20v22--v2662--67710--7141410--149914--9171714--17
Pas un ABR
ABR2424131324--13272724--278813--8171713--17v127--v1323227--32121217--12222217--22202032--20v232--v2
Pas un ABR
ABR5050161650--16707050--708816--8252516--25484870--48v470--v4v28--v217178--17191925--19v125--v1131317--13v317--v3v548--v5686848--68646468--64v668--v6
Pas un ABR
ABR2020141420--14232320--238814--8v114--v123--v1252523--25448--421218--21181825--18v425--v4101021--10v321--v37710--7131310--13v2
Pas un ABR
ABR4040353540--35606040--60303035--30414135--41202030--20343430--34101020--10v120--v1282834--28363634--365510--5232310--23v210--v2
Pas un ABR

Opérations de Base dans un ABR⚓︎

Dans un ABR quelconque, on souhaite usuellement disposer des \(3\) opérations de Base suivantes :

  • Recherche d'une Clé
  • Insertion d'une Clé
  • Suppression d'une Clé

Recherche dans un ABR quelconque⚓︎

ABR3434222234->22<3434->22666634->667722->7292922->2922->29>22505066->50717166->71v17->v117177->17252529->2529->25<29323229->329917->9212117->21889->816169->16232325->23282825->2825->28>25303032->30v432->v4272728->2728->27<28v228->v2262627->26v327->v3373750->37565650->56707071->70818171->81363637->36444437->44555556->55v656->v6353536->35v536->v5525255->52v755->v7515152->51v852->v8686870->68v970->v9808081->80979781->97676768->67696968->69949497->94v1097->v10888894->88v1194->v11

ABR quelconque
Recherche de 27

de la Recherche d'une Clé Cible dans un ABR quelconque

Dans un Arbre Binaire de Recherche (ABR) quelconque, l'unique chemin menant vers la Clé Cible (à partir de la racine) est obligatoirement calculable/parcourable de la manière suivante: Pour chaque noeud courant de chaque niveau parcouru :

  • Si la Clé Cible = clé du noeud courant du niveau, Alors on a bien trouvé la Clé Cible sur le niveau courant
  • Si la Clé Cible \(<\) clé du noeud courant du niveau, Alors la Recherche se poursuit dans le sous-arbre gauche du noeud
  • Si la Clé Cible \(>\) clé du noeud courant du niveau, Alors la Recherche se poursuit dans le sous-arbre droit du noeud

Lorsqu'on arrive au dernier niveau de cet unique chemin parcouru (le noeud est une feuille) mais sans avoir trouvé le nombre Cible, cela prouve que la Clé Cible n'existe nulle part dans l'ABR (inutile de vérifier les autres chemins à partir de la racine)

Concernant la Complexité :

Complexité de Recherche d'un nombre dans un ABR quelconque

Dans un ABR quelconque, dans le pire des cas, la complexité en temps de la Recherche d'une Clé Cible est en \(O(h)\), càd proportionnelle à sa hauteur \(h\)

Limitation des ABR quelconques

Malheureusement, l'algorithme de Recherche d'une clé dans un ABR n'est pas efficace lorsque l'ABR est quelconque, en effet il existe :

  • des ABR non équilibrés,
  • voire pire (cas extrême) : des ABR dégénérés (arbres peignes),

Dans chacun de ces deux cas, la hauteur \(h\) est égale à la taille \(n\) de l'arbre. Donc dans le pire des cas (où \(h=n\)), la complexité de la recherche d'une clé cible dans un ABR est linéaire en \(n\), càd est en \(O(n)\), donc aussi mauvais que pour les Listes et/ou les Files. D'ailleurs un ABR Peigne peut être considéré comme une Liste, ou une File. Pour éviter cela, il suffit d'empêcher les ABR d'être des Peignes, et plus généralement empêcher les ABR d'être non équilibrés. C'est pourquoi dans la suite, on s'intéressera à des Arbres Binaires de Recherche Équilibrés, que nous appelerons des Arbres AVL.

$$\Rightarrow$$

ABR4040353540--35v140--v1303035--30v235--v2202030--20v330--v3v420--v4222220--22v522--v5272722--27v627--v6292927--29
ABR non équilibré
ABR4040353540--35v140--v1303035--30v235--v2202030--20v330--v3101020--10v420--v45510--5v510--v5
ABR dégénéré.
Arbre Peigne Gauche
ABR77v17--v112127--12v212--v2151512--15v315--v3202015--20v420--v4252520--25v525--v5303025--30
ABR dégénéré.
Arbre Peigne Droite

Insertion dans un ABR quelconque⚓︎

ABR3434222234->22666634->6634->66>347722->7292922->29505066->5066->50<66717166->71v17->v117177->17252529->25323229->329917->9212117->21889->816169->16232325->23282825->28303032->30v432->v4272728->27v228->v2262627->26v327->v3373750->37565650->5650->56>50707071->70818171->81363637->36444437->44555556->5556->55<56v656->v6353536->35v536->v5525255->5255->52<28v755->v7515152->51535352->53>52686870->68v970->v9808081->80979781->97676768->67696968->69949497->94v1097->v10888894->88v1194->v11v8

ABR quelconque
Insertion de 53

Mth

L'Insertion d'un noeud (avec sa clé) se déroule en deux étapes :
1⃣ la Recherche de la position où insérer le noeud dans l'ABR : Dans le pire des cas, en \(O(h)\)
2⃣ l'Insertion : Dans le pire des cas, en \(O(1)\)
Durant la Recherche de la position où l'insérer :

  • Soit on trouve que cette clé existe déjà dans l'arbre, auquel cas :
    • On insère la nouvelle clé (doublon) comme fils gauche du noeud contenant la clé (par convention, et en général),
    • le SAG de la clé doublon devient le SAG de la nouvelle clé après son insertion
  • Soit on arrive à une feuille : on ajoute alors le nouveau noeud comme fils de la feuille en comparant sa clé à celle de la feuille :
    • Si clé nouveau noeud \(\le\) clé feuille, Alors le nouveau noeud sera à gauche de la feuille
    • Si clé nouveau noeud \(>\) noeud feuille, Alors le nouveau noeud sera à droite de la feuille

donc :

Complexité Insertion dans un ABR quelconque

Dans un ABR quelconque, dans le pire des cas, La complexité de l'Insertion est en \(O(h)\)

ABR10106610--6121210--12446--4v16--v1
AVANT insertion de 2 :
ABR équilibré
$$\Rightarrow$$
ABR10106610--6121210--12446--4v16--v1224--2v24--v2
APRÈS insertion de 2 :
ABR déséquilibré

Remarque

  • L'Insertion d'une clé dans un ABR est compatible avec la structure d'ABR, autrement dit : Après insertion d'une clé, un arbre ABR reste un arbre ABR.
  • ⚠ ATTENTION ⚠ Par contre, L'insertion d'une clé peut casser l'équilibre dans un ABR

Suppression dans un ABR quelconque⚓︎

\(3\) cas de Figure sont possibles :

Suppression d'une Feuille (Exemple : Suppression de la Feuille \(67\) )

ABR3434222234->22666634->6634->66>347722->7292922->29505066->50717166->7166->71>66v17->v117177->17252529->25323229->329917->9212117->21889->816169->16232325->23282825->28303032->30v432->v4272728->27v228->v2262627->26v327->v3373750->37565650->56707071->7071->70<71818171->81363637->36444437->44555556->55v656->v6353536->35v536->v5525255->52v755->v7515152->51v1252->v12686870->68<7070->68v970->v9808081->80979781->97676768->6768->67<68v1368->v13696968->69949497->94v1097->v10888894->88v1194->v11v8

ABR quelconque
BUT : Supprimer 67
1. Recherche de 67
2. On supprime la Feuille

ABR3434222234->22666634->6634->66>347722->7292922->29505066->50717166->7166->71>66v17->v117177->17252529->25323229->329917->9212117->21889->816169->16232325->23282825->28303032->30v432->v4272728->27v228->v2262627->26v327->v3373750->37565650->56707071->7071->70<71818171->81363637->36444437->44555556->55v656->v6353536->35v536->v5525255->52v755->v7515152->51v1252->v12686870->68<7070->68v970->v9808081->80979781->97v1368->v13696968->69949497->94v1097->v10888894->88v1194->v11v8

ABR quelconque
APRÈS Suppression de 67
La suppression d'une Feuille
ne déséquillibre pas l'ABR
(plus qu'il ne l'était déjà)

Suppression d'un noeud à \(1\) seul enfant (Exemple: Suppression de \(70\) )

ABR3434222234->22666634->6634->66>347722->7292922->29505066->50717166->7166->71>66v17->v117177->17252529->25323229->329917->9212117->21889->816169->16232325->23282825->28303032->30v432->v4272728->27v228->v2262627->26v327->v3373750->37565650->56707071->7071->70<71818171->81363637->36444437->44555556->55v656->v6353536->35v536->v5525255->52v755->v7515152->51v1252->v12686870->68v970->v9808081->80979781->97676768->67696968->69949497->94v1097->v10888894->88v1194->v11v8v13

ABR quelconque
BUT : Supprimer 70
:one: Recherche de 70
:two: Déterminer 68 = son unique enfant
:three: On supprime le noeud

ABR3434222234->22666634->6634->66>347722->7292922->29505066->50717166->7166->71>66v17->v117177->17252529->25323229->329917->9212117->21889->816169->16232325->23282825->28303032->30v432->v4272728->27v228->v2262627->26v327->v3373750->37565650->56686871->6871->68<71818171->81363637->36444437->44555556->55v656->v6353536->35v536->v5525255->52v755->v7515152->51v1252->v12676768->67696968->69808081->80979781->97949497->94v1097->v10888894->88v1194->v11v8v9v13

ABR quelconque
APRÈS Suppression de 70
La suppression d'un noeud à 1 seul enfant
peut déséquillibrer l'ABR
(plus qu'il ne l'était déjà)

Suppression d'un noeud à \(2\) enfants

Suppression, puis Remplacement par le max des min

ABR3434222234->22666634->6634->66>347722->7292922->29505066->5066->50<66717166->71v17->v117177->17252529->25323229->329917->9212117->21889->816169->16232325->23282825->28303032->30v432->v4272728->27v228->v2262627->26v327->v3373750->37565650->56707071->70818171->81363637->36444437->44555556->55v656->v6353536->35v536->v5525255->52v755->v7515152->51v1252->v12686870->68v970->v9808081->80979781->97676768->67696968->69949497->94v1097->v10888894->88v1194->v11v8

ABR quelconque
BUT : Supprimer 50
:one: Recherche de 50
:two: Déterminer 44 = le max des min

ABR3434222234->22666634->6634->66>347722->7292922->29444466->4466->44<66717166->71v17->v117177->17252529->25323229->329917->9212117->21889->816169->16232325->23282825->28303032->30v432->v4272728->27v228->v2262627->26v327->v3373744->37565644->56707071->70818171->81363637->36v1337->v13555556->55v656->v6353536->35v536->v5525255->52v755->v7515152->51v1252->v12686870->68v970->v9808081->80979781->97676768->67696968->69949497->94v1097->v10888894->88v1194->v11v8

ABR quelconque
APRÈS Suppression de 50
+ Remplacement par 44 = le max des min
La suppression d'un noeud à 2 enfants
peut déséquillibrer l'ABR
(plus qu'il ne l'était déjà)

Suppression, puis Remplacement par le min des max

ABR3434222234->22666634->6634->66>347722->7292922->29505066->5066->50<66717166->71v17->v117177->17252529->25323229->329917->9212117->21889->816169->16232325->23282825->28303032->30v432->v4272728->27v228->v2262627->26v327->v3373750->37565650->56707071->70818171->81363637->36444437->44555556->55v656->v6353536->35v536->v5525255->52v755->v7515152->51v1252->v12686870->68v970->v9808081->80979781->97676768->67696968->69949497->94v1097->v10888894->88v1194->v11v8

ABR quelconque
BUT : Supprimer 50
:one: Recherche de 50
:two: Déterminer 51 = le min des max

ABR3434222234->22666634->6634->66>347722->7292922->29515166->5166->51<66717166->71v17->v117177->17252529->25323229->329917->9212117->21889->816169->16232325->23282825->28303032->30v432->v4272728->27v228->v2262627->26v327->v3373751->37565651->56707071->70818171->81363637->36444437->44555556->55v656->v6353536->35v536->v5525255->52v755->v7v1352->v13v1252->v12686870->68v970->v9808081->80979781->97676768->67696968->69949497->94v1097->v10888894->88v1194->v11v8

ABR quelconque
APRÈS Suppression de 50
+ Remplacement par 51 = le min des max
La suppression d'un noeud à 2 enfants
peut déséquillibrer l'ABR
(plus qu'il ne l'était déjà)

Suppression d'un noeud dans un ABR quelconque

La Suppression d'un noeud d'un ABR quelconque se fait en deux étapes:
1⃣ On Recherche la clé dans l'ABR : Dans le pire des cas, en \(O(h)\)
2⃣ On le Supprime : Dans le pire des cas, en \(O(1)\). Trois situations sont possibles:

  • Suppression d'une feuille : Il suffit de l'enlever de l'arbre puisqu'elle n'a pas de fils.
  • Suppression d'un noeud avec un enfant : Il faut l'enlever de l'arbre en le remplaçant par son unique fils (gauche ou droit).
  • Suppression d'un noeud \(N\) avec deux enfants : Dans ce cas, pour préserver la structure d'arbre ABR après la suppression du noeud \(N\), on peut :
    • Remplacer \(N\) par le plus grand des nombres plus petits que lui (le max des min): càd par le noeud le plus à droite du sous-arbre gauche de \(N\). Ou bien :
    • Remplacer \(N\) par le plus petit des nombres plus grands que lui (le min des max): càd par le noeud le plus à gauche du sous-arbre droit de \(N\).

Complexité de la Suppression dans un ABR quelconque

Dans un ABR quelconque, dans le pire des cas, La complexité de la Suppression est en \(O(h)\)

Remarque

ABR10106610--6121210--12446--4v16--v1
AVANT suppression de 12 :
ABR équilibré
ABR10106610--6v110--v1446--4v26--v2
APRÈS suppression de 12 :
ABR déséquilibré
  • En choisissant correctement le remplaçant du noeud supprimé (par le max des min, ou par le min des max), la Suppression d'une clé dans un ABR est compatible avec la structure d'ABR, autrement dit : Après Suppression d'une clé, un arbre ABR reste un arbre ABR.
  • ⚠ ATTENTION ⚠ Par contre, La Suppression d'une clé peut casser l'équilibre dans un ABR

Résumé des Opérations dans un ABR quelconque⚓︎

Pte

Dans un ABR quelconque, on peut calculer la complexité dans le pire des cas, pour chacune des opérations suivantes :

  • La Recherche d'une clé est en \(O(h)\) \(\,\,\)\(h\) désigne la hauteur de l'ABR
  • L'Insertion d'une clé est en \(O(h)\)
  • La Suppression d'une clé est en \(O(h)\)

Conséquences Pour la Recherche, l'Insertion, ou la Suppression :

  • Pour les ABR équilibrés (= Arbres AVL, cf le § ci-après) : en \(O(\log_2 n)\)
  • pour les ABR déséquilibrés : en \(O(n)\)