Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
1
Arbre binaire
2
Sommaire Introduction Terminologie Arbre Binaire
Arbre de recherche binaire Chapitre 8 Data Structures & Algorithm, 2nd Edition, Robert Lafore
3
Introduction Tableau ordonné : Liste chaînée :
opération de recherche : O(logN) opération d'insertion - suppression : recherche position déplacement N/2 items en moyenne Liste chaînée : opération d'insertion : O(1) opération de suppression : O(1) opération de recherche : O(N) Deux types de structure de données avec : insertion/suppression rapide comme dans le cas de la liste recherche rapide comme dans le tableau Arbre : possède ces caractéristiques structure de données la plus intéressante Structures linéaires (séquences) : les listes chaînées, les piles et les queues Structures non linéaires : Arbres
4
Introduction Arbre : un arbre est une structure à deux dimensions comportant une collection d'éléments appelés nœuds (nodes) associés entre eux par des arcs (edges) selon un ordre hiérarchique strict Dans un arbre, chaque nœud peut avoir plusieurs nœuds descendants appelés enfants (fils) mais il ne peut avoir qu'un seul ascendant, le parent.
5
Introduction Les nœuds sont identifiés par les lettres A à K
A est le père des nœuds B, C, D, E B est le père des nœuds F et G D est le père de H E est le père des nœuds I, J, K
6
Introduction Les nœuds représentent des entités tels que : personne, les composants d'une voiture, une entité du monde réel, etc. Les arcs : représentés par des références dans un programme Java (pointeurs en C++) Différents types d'arbres : arbre avec plusieurs enfants par nœud arbre avec un maximum de deux enfants par nœud : arbre binaire
7
Terminologie
8
Terminologie Chemin (path) : le chemin d'un nœud est la suite de nœuds par lesquels il faut relier la racine à celui-ci Racine : La racine d'un arbre est le seul nœud n'ayant pas de parent – il y a une seule racine dans un arbre Parent : un nœud quelconque (excepté la racine) ne peut avoir qu'un seul nœud ascendant – le parent Enfant : Chaque nœud peut avoir plusieurs nœuds descendants appelés enfants Feuille : une feuille est un nœud n'ayant aucun enfant Sous arbre : un sous arbre est un sous ensemble de nœud d'un arbre ayant une structure d'arbre Visiter un nœud : un nœud est visité lorsque le contrôle de programme arrive à ce nœud, généralement, pour effectuer une certaine opération au niveau du nœud Traverser : traverser un arbre signifie visiter tous les nœuds d'un arbre dans un ordre spécifié Niveau : le niveau d'un nœud correspond au nombre de nœud de son chemin Exemple : racine de niveau 0 enfants de la racine de niveau 1 Clé : la clé d'un item est représentée dans un cercle
9
Arbre binaire Un arbre binaire est un arbre dont les nœuds peuvent avoir au maximum deux enfants Dans un arbre binaire les enfants d'un nœud sont respectivement appelés enfant de gauche et enfant de droite Un nœud dans un arbre binaire peut avoir : un enfant de gauche et un enfant de droite un enfant de gauche seulement un enfant de droite seulement aucun enfant – feuille Intérêt des arbres binaires : simplicité utilisation répandue examen de tous les algorithmes de base cas particulier : arbre de recherche binaire
10
Arbre de recherche binaire (introduction)
Un arbre de recherche est un arbre binaire satisfaisant aux propriétés suivantes : L'étiquette de chaque nœud contient une valeur particulière d'un type ordonné – cette valeur est appelée clé Pour tous sous arbre, la clé de la racine est supérieure à toutes les clés du sous arbre gauche et inférieure à celles du sous arbre droit
11
Arbre de recherche binaire (représentation d’un arbre)
Différentes approches peuvent implémenter un arbre : tableau stocker les nœuds dans des espaces non contigus et les connecter par des références Exemples de représentation class Node { int iData; // donnée clé double fData; // autre donnée Node leftChild; // enfant de gauche Node rightChild // enfant de droite … public void displayNode() {… }
12
Arbre de recherche binaire (représentation d’un arbre)
Exemples de représentation class Node { Person p; // donnée clé Node leftChild; // enfant de gauche Node rightChild // enfant de droite …. public void displayNode() {… } } class Person int iData;
13
Arbre de recherche binaire (représentation d’un arbre)
Définition de la classe arbre (Tree) class Tree { private Node root; // un seul champ … public void find(int key) { … }
14
Arbre de recherche binaire (Opérations)
Rechercher un nœud dans un arbre Insérer un nœud dans un arbre Supprimer un nœud dans arbre Parcourir un arbre Afficher un arbre
15
Arbre de recherche binaire (Opérations)
Rechercher un nœud dans un arbre Un nœud dans un arbre de recherche : objet contenant l'information Exemple : Personne numero-Employe (clé) nom prenom Composant-Voiture num-Composant quantité prix … Processus de recherche Clé recherchée : 57
16
Arbre de recherche binaire (Opérations)
Processus de recherche Clé recherchée : 57
17
Arbre de recherche binaire (Opérations)
Algorithme (programme) de recherche dans un arbre Node find (int key) { Node current =root; while (current.iData != key) if (key < current.iData) current = current.leftChild; else current = current.rightChild; if (current == null) return null; } return current;
18
Arbre de recherche binaire (Opérations)
Algorithme (programme) de recherche dans un arbre Efficacité: Recherche : à quel niveau se situe le nœud ? Arbre 5 niveaux => 5 comparaisons au maximum Recherche: O(log2N)
19
Arbre de recherche binaire (Opérations)
Insertion : recherche du parent du nœud à insérer Exemple: Insérer 45
20
Arbre de recherche binaire (Opérations)
Insertion : Algorithme (programme) void insert (int id, double dd){ Node newNode = new Node(); newNode.iData = id; newNode.fData = dd; if (root == null) root = newNode; else { Node current = root; Node parent; While (true) { parent = current; if( id< current.iData) { current = current.leftChild; if (current == null) { parent.leftChild = newNode; return;} } else { current = current.rightChild; if (current == null) { parent.rightChild = newNode;
21
Arbre de recherche binaire (Opérations)
Parcours d’un arbre: visiter chaque nœud de l'arbre selon un ordre spécifié Trois parcours utilisés : préordre, symétrique (inorder) et postordre Parcours symétrique : parcours le plus utilisé pour parcourir un arbre de recherche binaire Parcours symétrique: le parcours symétrique d'un arbre permet d'obtenir les éléments triés en ordre croissant Traverser les nœuds du sous arbre gauche avant la racine Visiter la racine Traverser les nœuds du sous arbre droit
22
Arbre de recherche binaire (Opérations)
Parcours symétrique Void inorder (Node localRoot) { if ( localRoot ! = null) { inorder (localRoot.leftChild); system.out.println(localRoot.iData " "); inorder (localRoot.rightChild); }
23
Arbre de recherche binaire (Opérations)
Parcours en préordre visiter la racine traverser les nœuds du sous arbre gauche traverser les nœuds du sous arbre droit Parcours en postordre
24
Arbre de recherche binaire (Opérations)
Recherche du minimum ou du maximum Recherche du minimum : enfant de gauche
25
Arbre de recherche binaire (Opérations)
Recherche du minimum ou du maximum Recherche du minimum Node minimum() { Node current, last; Current = root; While (current != null) last = current; current = current.leftChild(); } return last;
26
Arbre de recherche binaire (Opérations)
Suppression d’un nœud Suppression d'un nœud : recherche du nœud Pour la suppression d'un nœud trois cas à considérer : le nœud à supprimer est une feuille le nœud à supprimer à un enfant le nœud à supprimer à deux enfants cas 1 : Nœud à supprimer est une feuille Supprimer un nœud feuille : mettre à null le champ du parent pointant vers le nœud à supprimer
27
Arbre de recherche binaire (Opérations: Suppression d’un noeud)
Node current = Node parent = root ; Boolean isleftChild = true; while (current.iData != key){ parent = current; if(key < current.iData){ isleftChild =true; current = current.leftChild; } else{ isleftChild =false; current = current.rightChild; if (current == null) return false; } if (current.leftChild ==null && current.rightChild == null){ if (current == root) root = null else if (isleftChild) parent.leftChild = null else parent rightChild = null
28
Arbre de recherche binaire (Opérations: Suppression d’un noeud)
Cas 2 : Suppression d’un noeud ayant un enfant Le nœud à supprimer possède deux connections : vers le parent et vers l’enfant Connecter l’enfant du nœud à supprimer avec le parent du nœud à supprimer Cas possibles : enfant du nœud à supprimer : enfant de gauche ou enfant de droite nœud à supprimer par rapport au parent : enfant de gauche ou enfant de droite nœud à supprimer : racine
29
Arbre de recherche binaire (Opérations:Suppression d’un noeud)
Cas 2 : Suppression d’un noeud ayant un enfant // si pas d’enfant de droite remplacer par le sous arbre de gauche else if (current.rightChild == null) if (current == root) root = current.leftChild; else if (isleftChild) // si le noeud à supprimer est un enfant de gauche parent.leftChild = current.leftChild; else // le noeud à supprimer est un enfant de droite parent.rightChild = current.leftChild;
30
Arbre de recherche binaire (Opérations:Suppression d’un noeud)
Cas 2 : Suppression d’un noeud ayant un enfant // si pas d’enfants à gauche, remplacer avec le sous arbre de droit else if(current.leftChild==null) if(current == root) root = current.rightChild; else if(isLeftChild) // left child of parent parent.leftChild = current.rightChild; else // right child of parent parent.rightChild = current.rightChild; // ...
31
Arbre de recherche binaire (Opérations:Suppression d’un noeud)
Cas 3 : suppression d’un nœud ayant deux enfants Arbre binaire de recherche : nœud – ordre ascendant de clés Pour chaque nœud : le nœud avec la valeur élevée est appelé successeur (inorder successor) Supprimer un nœud ayant deux enfants consiste à le remplacer par son successeur
32
Arbre de recherche binaire (Opérations: Suppression d’un noeud)
Cas 3 : suppression d’un nœud ayant deux enfants Node getSuccessor(Node delNode) { Node successorParent = delNode Node successor = delNode Node current = delNode.rightChild; while( current != null) { successorParent =successeur; successor = current; current = current.leftChild } if (successor != delNode.rightChild) successorParent.leftChild = successor.rightChild; successor. rightChild = delNode.rightChild; return successor;
33
Arbre de recherche binaire (Efficacité des opérations)
Nombre de noeuds Nombre de niveaux … Si le nombre de nœuds est : N Nombre de niveaux : L N = 2L – L = N + 1 L = log2 (N + 1) Opérations courante : O(log2N) L’arbre : opérations communes plus efficaces que dans le cas des autres structures Traversée : moins rapide
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.