Arbre Binaire

download Arbre Binaire

of 23

Transcript of Arbre Binaire

  • 7/26/2019 Arbre Binaire

    1/23

    X, Petite classe 5X, Petite classe 7

    Parcours d'arbres

    Prfixe: 1, 2, 4, 8, 9, 5, 10, 3, 6, 7

    (VGD)Infixe: 8, 4, 9, 2, 10, 5, 1, 6, 3, 7(GVD)

    Suffixe: 8, 9, 4, 10, 5, 2, 6, 7, 3, 1(GDV)

    1

    2 3

    4 5 6 7

    8 9 10

  • 7/26/2019 Arbre Binaire

    2/23

    X, Petite classe 5X, Petite classe 7

    typedefstruct Noeud{

    Element contenu;struct Noeud *filsG;

    struct Noeud *filsD;}*Arbre;

    voidParcoursPrefixe(Arbre a)

    {if(a != NULL){

    printf("%3d", a->contenu);ParcoursPrefixe(a->filsG);

    ParcoursPrefixe(a->filsD);}

    }

  • 7/26/2019 Arbre Binaire

    3/23

    X, Petite classe 5X, Petite classe 7

    voidParcoursInfixe(Arbre a){

    if(a != NULL){

    ParcoursInfixe(a->filsG);printf("%3d", a->contenu);ParcoursInfixe(a->filsD);

    }}

    voidParcoursSuffixe(Arbre a){

    if(a != NULL){

    ParcoursSuffixe(a->filsG);ParcoursSuffixe(a->filsD);printf("%3d", a->contenu);

    }}

  • 7/26/2019 Arbre Binaire

    4/23

    X, Petite classe 5X, Petite classe 7

    Proprit de base : Pour chaque

    noeud de valeur v, les noeuds dusous-arbre gauche ont une valeur< v et ceux du sous-arbre droitont une valeur > v.

    Arbres de recherche

    1310

    8 14 2116

    1912

    15

    17

  • 7/26/2019 Arbre Binaire

    5/23

    X, Petite classe 5X, Petite classe 7

    Exercices

    (1) Montrer que le parcours infixeordonne les nuds par valeurcroissante.

    (2) Montrer que si un nud adeux fils, son successeur dansl'ordre infixe n'a pas de fils

    gauche et son prdcesseur n'apas de fils droit.

    (3) Montrer que le successeurdu

    nud n est le sommet le plus gauche dans le sous-arbre droitissu de n.

  • 7/26/2019 Arbre Binaire

    6/23

    X, Petite classe 5X, Petite classe 7

    Arbre Recherche(Element v, Arbre a){

    if (a == NULL || v == a->contenu)

    returna;if (v < a->contenu)

    returnRecherche(v, a->filsG);returnRecherche(v, a->filsD);

    }

    Recherche

  • 7/26/2019 Arbre Binaire

    7/23

    X, Petite classe 5X, Petite classe 7

    Arbre NouvelArbre(Element v, Arbre a,Arbre b){ Arbre c;

    c = (Arbre)malloc (sizeof(struct Noeud)); c->contenu = v; c->filsG = a; c->filsD = b; return c;}

    voidAjouterArbre(Element v, Arbre *ap){

    Arbre a = *ap;

    if(a ==NULL )

    a = NouvelArbre(v, NULL , NULL );else if(v contenu)

    AjouterArbre(v, &a->filsG);else

    AjouterArbre(v, &a->filsD);*ap = a;

    }

    Ajout d'un lment

  • 7/26/2019 Arbre Binaire

    8/23

    X, Petite classe 5X, Petite classe 7Suppression

    (a) le noeud est une feuille : on lesupprime

    10

    8 14 2116

    1912

    15

    171310

    8 14 2116

    1912

    15

    17

    (b) le noeud est un a un seul fils :on la supprime

    10

    8 13 2116

    1912

    15

    171310

    8 14 2116

    1912

    15

    17

  • 7/26/2019 Arbre Binaire

    9/23

    X, Petite classe 5X, Petite classe 7

    (c) le noeud s a deux fils : onsupprime son successeur t (quin'a pas de fils gauche), mais onremplace la valeur de s par cellede t.

    1310

    8 14 2116

    1912

    15

    17 1310

    8 14 2116

    1912

    15

    17

    1310

    8 14 2117

    1912

    16

  • 7/26/2019 Arbre Binaire

    10/23

    voidSupprimerArbre(Element v, Arbre *ap){

    Arbre a = *ap;

    if(a == NULL)*ap = a;

    else if(v < a->contenu)SupprimerArbre(v, &a->filsG);

    else if(v > a->contenu)

    SupprimerArbre(v, &a->filsD);else if(a->filsG == NULL )

    *ap = a->filsD;else if(a->filsD == NULL )

    *ap = a->filsG;else(*ap)->contenu =

    SupprimerSuccesseur(&a);}

    Element SupprimerSuccesseur(Arbre *ap){

    Arbre a = *ap;Element v;

    if(a->filsG == NULL ){

    v = a->contenu;a =NULL ;return v;

    }

    return SupprimerSuccesseur(&(a->filsG));}

  • 7/26/2019 Arbre Binaire

    11/23

    X, Petite classe 5X, Petite classe 7

    O(log n) si l'arbre est quilibr

    O(n) si l'arbre est filiforme

    --> D'o l'intrt des arbresquilibrs!

    Arbre AVL(Adel'son-Vel'skii etLandis) : pour tout noeud, ladiffrence de hauteur entre lessous-arbres gauche et droit estgale -1, 0 ou 1.

    Exemple: les tas

    Hauteurd'un arbre AVL : O(log n)

    Temps de calcul

  • 7/26/2019 Arbre Binaire

    12/23

    X, Petite classe 5X, Petite classe 7

    typedefstruct NoeudAVL{

    int balance;Element contenu;struct NoeudAVL *filsG;

    struct NoeudAVL *filsD;}*ArbreAVL;

  • 7/26/2019 Arbre Binaire

    13/23

    X, Petite classe 5X, Petite classe 7

    Thorme. Soit un arbre AVL dehauteur h n sommets. Alors

    log2(1 + n) 1 + h 1,44 log2(1 + n)

    Preuve. Pour une hauteur hdonne, le nombre maximum desommets est atteint pour l'arbrecomplet 2h+1- 1 sommets.Hauteur 0 :

    Hauteur 1 :

    Hauteur 2 :

    Donc n 2h+1-1 et log2(1 + n) 1 + h

  • 7/26/2019 Arbre Binaire

    14/23

    X, Petite classe 5X, Petite classe 7

    Soit N(h) le nombre minimum desommets d'un arbre AVL dehauteur h. On a

    N(0) = 0 N(1) = 2

    N(h) = 1 + N(h-1) + N(h-2)

    Donc F(h) = N(h) + 1 vrifieF(0) = 2 F(1) = 3

    F(h) = F(h-1) + F(h-2)d'o F(h) = Fh+3=

    1 [(1 + 5)h+3

    - (1 - 5)h+3

    ]

    h-1 h-2

    5 2 2

  • 7/26/2019 Arbre Binaire

    15/23

    X, Petite classe 5X, Petite classe 7

    Rotation simple

    h-1 h-2X Y

    h-2Z

    u v

    x

    h-1X

    Yh-2

    Z

    u

    v

    x

    u x v

  • 7/26/2019 Arbre Binaire

    16/23

    X, Petite classe 5X, Petite classe 7

    Double rotation

    u v x w

    x

    h-2

    h-2

    X

    V

    h-2Z

    u

    v

    w

    W

    v

    w

    u

    X Z

    h-2V W

    x

  • 7/26/2019 Arbre Binaire

    17/23

    X, Petite classe 5X, Petite classe 7

    Donnes : une partition del'ensemble {1, ..., K}

    Trouverla classe d'un lment

    Faire l'unionde deux classes.

    Partitions

    Une premire solution :Reprsenter la partition par untableau classetel que classe[i]soit la classe de l'lment i.

    Trouver: O(1)Union: O(n)

  • 7/26/2019 Arbre Binaire

    18/23

    X, Petite classe 5X, Petite classe 7

    Deuxime solution : utilisationd'une fort.

    10

    6

    8 4

    95

    1

    117

    3

    2

    Trouver: O(n)Union: proportionnel lahauteur de l'arborescence

    On reprsente la fort par untableau t tel que t[s] = pre de s(si s est une racine, t[s] = s)

  • 7/26/2019 Arbre Binaire

    19/23

    X, Petite classe 5X, Petite classe 7

    Union pondre

    Rgle: Lors de l'union, la racinede l'arbre le moins haut devientfils de la racine de l'arbre le plus

    haut.

    6

    10

    8 4

    95

    1

    117

    3

    2

    On part de la partition de {1, ..., K}en K classes.

    1 2 K

  • 7/26/2019 Arbre Binaire

    20/23

    X, Petite classe 5X, Petite classe 7

    Notons ti(x)la taille (= nombre denoeuds) et hi(x) la hauteur dusommet x aprs la i-me oprationd'union pondre. On a t0(x) = 1et

    h0(x) = 0.

    Lemme. On a ti(x) 2hi(x)et

    hn(x) log2(n + 1).

    Preuve.(a) Si hi(x) = 0, alorsti(x) = 1

    (b) suivre

    x

  • 7/26/2019 Arbre Binaire

    21/23

    X, Petite classe 5X, Petite classe 7

    Lemme. On a ti(x) 2hi(x)ethn(x) log2(n + 1).

    Preuve (suite).

    (b) Si hi(x) > 0, soit y un fils de x. On ahi(y) = hi(x) - 1. Si y est devenu un fils

    de x lors de la j-ime union (j i), on a

    tj-1(x) tj-1(y), d'o tj(y) = tj-1(y) et

    tj(x)

    2tj(y). Ensuite, la taille de y nevarie plus, mais celle de x peut crotre.De mme, la hauteur de y ne varie

    plus, donc hi(y) = hj-1(y). Par hypothse

    de rcurrence, tj-1(y) 2hj-1(y), donc

    tj(y) = tj-1(y) 2hj-1(y)= 2hi(y)ettj(x)tj(x)2.tj(y)2.2

    hi(y)=2hi(x)

    Comme tn(x) n+1, on a la secondeingalit.

    x

    y

  • 7/26/2019 Arbre Binaire

    22/23

    X, Petite classe 5X, Petite classe 7

    Corollaire. Une suite de n-1

    "unions" et de m "trouver" se

    ralise en temps O(n + m log n).

  • 7/26/2019 Arbre Binaire

    23/23

    X, Petite classe 5X, Petite classe 7

    Compression des cheminsOn comprime un chemin en faisant

    de chaque nud travers un fils de

    la racine :

    10

    8 4

    95

    1

    10

    8

    4 95

    1

    Prop. Une suite de n-1"unions" et

    de m "trouver" (m n) se raliseen temps O(m.(n,m)), o estune sorte d'inverse de la fonction

    d'Ackermann. En pratique, (n,m)2.