Arbre - Axiomes

Étienne9 Messages postés 1090 Statut Membre -  
KX Messages postés 19031 Statut Modérateur -
Bonjour à tous,

J'ai contrôle Mardi et je me torture à essayer de comprendre des axiomes mais ça ne veut pas rentrer. Est-ce que quelqu'un peut m'aider à comprendre s'il vous plaît ? Merci.

--- Ajouter à la racine :
ajouter_rac(x,arbre_vide) = <x,arbre_vide,arbre_vide>
racine(ajouter_racine(x,<r,G,D)) = x)

x< r =>
g(ajouter_racine(x,<r,G,D>)) = g(ajouter_racine(x,G))
d(ajouter_rac(x,<r,G,D>)) <r,d(rajouter_racine(x,G)),D>)

x >= r =>
g(ajouter_racine(x,<r,G,D>)) = <r,G,g(ajouter_racine(x,D))>
d(rajouter_racine(x,<r,G,D>)) = d(ajouter_racine(x,D))>

Merci beaucoup d'avance. Ce qui m'embête le plus c'est le g(...) et le d(...), je ne sais pas ce que c'est....

3 réponses

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    "Ce qui m'embête le plus c'est le g(...) et le d(...), je ne sais pas ce que c'est...."
    Ce sont tous simplement les sous-arbres gauche et droit de ton arbre binaire de recherche.
    0
  2. Étienne9 Messages postés 1090 Statut Membre 49
     
    Oui mais au début c'est la racine, on fait comment pour savoir si la racine est un sous-arbre gauche ou droite ????
    0
    1. KX Messages postés 19031 Statut Modérateur 3 020
       
      La racine n'est jamais un sous-arbre, vu que c'est la racine !

      Tu dois avoir d'autres axiomes pour ta structure d'arbre qui disent :

      racine(<r,G,D>)=r
      g(<r,G,D>)=G
      d(<r,G,D>)=D

      À aucun moment on n'a r=G ou r=D.
      0
  3. Étienne9 Messages postés 1090 Statut Membre 49
     
    Salut KX,

    J'ai un problème je ne sais pas comment faire, mon professeur m'a demandé désormais pour le construire-tas il s'en fiche il veut que ça s'affiche tout de suite. Par contre pour le trier-tas il veut voir l'arbre diminuer au fur et à mesure de taille et l'afficher complet à la fin.
    Comment faire s'il vous plaît ?

    Voici mes codes finaux :

    import java.util.Scanner;
    
    public class tas
    {
    	public static affarbre aff = new affarbre();
    	public static int[] entasser(int tab[], int ip, int indiceFin) // ip pour indice p�re
    	{
    		int ifg; // indice fils gauche
    		int ifd; // indice fils droit
    		int inter; // entier intermédiaire pour échanger éventuellement deux valeurs
    		int max=ip; // indice du plus grand noeud, au début on suppose que c'est le père
    		if ((ip >= 1) && (ip <= indiceFin)) // l'indice du pèe p doit impérativement appartenir au tableau
    			{
    				ifg=2*ip;
    				ifd=2*ip+1;
    				if (ifg > indiceFin) // si pas de fils gauche, alors il ne peut pas y avoir de fils droit donc on est sur une feuille
    				{
    					return tab; // fin de la récursivité, on retourne le tableau
    				}
    				if (ifd > indiceFin) // si on est en dessous, il y a nécessairement un fils gauche donc il faut tester le fils droit
    				{ // seul le fils gauche est présent :
    					if (tab[ifg] > tab[ip]) // si l'indice fils gauche est plus grand il va falloir le faire remonter
    					{ // il faut faire monter le fils gauche et descendre le père
    						inter=tab[ip];
    						tab[ip]=tab[ifg];
    						tab[ifg]=inter;						
    						// comme il n'y a que le fils gauche, la récursivitïé s'arrête là et il est inutile d'enregistrer dans max l'indice du plus grand
    						return tab;
    					}
    					// tout va bien, le père est plus grand que le fils gauche, on renvoie juste le tableau et pas besoin d'enregistrer l'indice du plus grand dans max.
    					return tab;
    				} // les deux fils sont présents :
    				if (tab[ifg] > tab[ifd])
    				{
    					max=ifg;
    				}
    				else {
    					max=ifd;
    				}
    				// on compare les deux fils et on met l'indice du noeud qui a la plus grande valeur dans max puis on va comparer avec le père.
    				if (tab[ip] < tab[max]) 
    				{
    					inter=tab[ip];
    					tab[ip]=tab[max];
    					tab[max]=inter;						
    					return entasser(tab,max,indiceFin);	
    				}
    				return tab;
    			} // si on est en dessous alors le père n'appartient pas au tableau alors on renvoit le tableau :
    			return tab;
    	}
    	public static int[] construiretas(int tab[],int indiceFin)
    	{
    		int i;
    		for (i=(indiceFin)/2;i>=1;i--) // on appelle entasser du dernier noeud qui n'est pas une feuille jusqu'� la racine.
    		{
    			entasser(tab,i,indiceFin);
    			aff.setTab(tab);
    		}
    		return tab;
    	}
    	public static int[] triertas(int tab[],int indiceFin)
    	{
    		if (indiceFin == 1) {
    			return tab; // si l'indice est de 1 ou si la racine est plus grande que le dernier élément alors on arrête.
    		}
    		int inter;
    		inter=tab[1];
    		tab[1]=tab[indiceFin];
    		tab[indiceFin]=inter;
    		entasser(tab,1,indiceFin-1);
    		aff.setTab(tab);
    		return triertas(tab,indiceFin-1); // sinon on recommence en décrémentant la taille.
    	}
    	public static void main(String args[])
    	{
    		int tab[];
    		int i;
    		int indiceFin;
    		System.out.print('\n');
    		System.out.println("Nombre de noeuds de l'arbre ?");
    		System.out.println("AVERTISSEMENT : POUR UN AFFICHAGE OPTIMAL, NE PAS METTRE PLUS DE 53 NOEUDS");
    		indiceFin = (new Scanner(System.in)).nextInt();
    		tab = new int[indiceFin+1];
    		for(i=1;i<=indiceFin;i++)
    		{ // On saisie toutes les valeurs et on remplit.
    			System.out.println("Noeud num " + i);
    			tab[i]=(new Scanner(System.in)).nextInt();
    		}
    		System.out.print('\n');
    		System.out.println("Lancement du tri avec construire tas dans 10 secondes...");
    		System.out.println("Veuillez patienter. Merci.");
    		System.out.print('\n');
    		try { Thread.sleep(10000); } catch (InterruptedException e) { }
    		System.out.println("TRI AVEC CONSTRUIRE-TAS :");
    		tab = construiretas(tab,indiceFin);
    		for(i=1;i<=indiceFin;i++)
    		{
    			System.out.print(tab[i] + " ");
    		}
    		System.out.print('\n');
    		System.out.print('\n');
    		System.out.println("Lancement du tri par tas dans 10 secondes...");
    		System.out.println("Veuillez patienter. Merci.");
    		System.out.print('\n');
    		try { Thread.sleep(10000); } catch (InterruptedException e) { }
    		System.out.println("TRI PAR TAS :");
    		tab = triertas(tab,indiceFin); // on exécute construiretas et on inverse tab[A] avec tab[indiceFin].
    		for(i=1;i<=indiceFin;i++)
    		{
    			System.out.print(tab[i] + " ");
    		}
    		System.out.print('\n');
    	}
    }
    


    import java.awt.Color;
    import java.awt.Graphics;
    import java.lang.Math.*;
    import javax.swing.JFrame;
    
    public class affarbre extends JFrame
    {
        private static final long serialVersionUID = 1;
        private int[] tab; // le tableau pour dessiner l'arbre
        public void setTab(int...val) // cette petite fonction permet de mettre à jour l'arbre, on change le tableau et on dessine à nouveau
        {
        	    tab = val;
        	    repaint();
        	    try { Thread.sleep(3000); } catch (InterruptedException e) { } // Temps d'attente pour avoir le temps de voir l'arbre évoluer.
        }
        public affarbre(int...arbre) // création de la fenêtre pour dessiner
        {
            tab = arbre;
            setTitle("Arbre"); // Titre de la fenêtre
            setSize(1024,768); // Taille de la fenêtre
            setLocationRelativeTo(null);
            setVisible(true); // Pour rendre visible la fenêtre.
            setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); // Pour pouvoir fermer la fenêtre.  
        }
        public void paint(Graphics g) // l'algorithme qui dessine un arbre en partant d'un tableau
        {
            super.paint(g);
            int hauteur = (int)(( Math.log((double) tab.length-1))/(Math.log((double) 2)));
            int n=(int) (tab.length - Math.pow(2,hauteur)); // Correspond au nombre de noeuds sur la hauteur h.
            int i=0;
            int y=0;
            int indicetab=tab.length-1;
            int pas=(int) ((1024)/(Math.pow(2,hauteur)+1));
            int x=pas;
            int bordgauche=pas; // Correspond au bord gauche (l'espace entre le bord gauche et le premier noeud)
            while (hauteur >= 0) // on part du bas et on remonte dans la hauteur
            {
            	if (y != 0) { // tout le temps sauf dans le cas où c'est la première fois car pour la hauteur la plus haute on partage l'espace disponible en parties égales
            		n = (int) Math.pow(2,hauteur); // Nombre de noeuds sur la hauteur h.
            		x = bordgauche;
            	}
            	y = (hauteur+2)*33;// on calcule le y par rapport à la hauteur
            	indicetab=indicetab-n+1; // permet de venir sur la première case du tableau qui correpond à la vzleur du premier noeud
            	for (i=1;i<=n;i++) {
            		g.fillOval(x-11,y-7,23,23); // On dessine un noeud
            		if (hauteur > 0) { // Dans toutes les hauteurs sauf la racine on dessine les lignes entre les noeuds
            			if ((i % 2) == 0) {
            				g.drawLine(x,y,(int)(x-(pas/2)),y-33); // i est pair donc la ligne penche à gauche
            			} 
            			else {
            				g.drawLine(x,y,(int)(x+(pas/2)),y-33); // i est impair donc la ligne penche à droite
            			}
            		}
            		g.drawString(tab[indicetab] + "",x,y-7); // On écrit la valeur du noeud, -7 permet d'ajuster correctement l'écriture pour la mettre plus haute sinon elle est cachée par le noeud
            		indicetab=indicetab+1; // On parcout les cases du tableau sur la hauteur donnée
            		x = x+pas; // On n'oublie pas aussi de déplacer les coordonnées x.
            	}
            	indicetab = indicetab-n-1; // On n'oublie pas de mettre l'indicetab en place pour la prochaine hauteur.
            	bordgauche = (int) (bordgauche+(pas/2)); // On augmente le bord.
            	pas = 2*pas; // Le pas suivant sera deux fois plus grand.
            	hauteur = hauteur-1; // On diminue bien sûr la hauteur.
            }
        }
    }
    
    0
    1. KX Messages postés 19031 Statut Modérateur 3 020
       
      Dans ton code tu as des "paramètres graphiques" qui sont fixés :

      Je ne suis pas sûr de les avoir toutes mais je parle entre autre de ces lignes là :

      int pas=(int) ((1024)/(Math.pow(2,hauteur)+1));
      
      y = (hauteur+2)*33;
      
      g.fillOval(x-11,y-7,23,23);
      
      g.drawLine(x,y,(int)(x-(pas/2)),y-33);

      Il faudrait que toutes ses valeurs dépendent de la taille de la fenêtre (jframe.getWidth, jframe.getHeight), et à la taille de l'arbre (int hauteur, et int h) pour dynamiser ton affichage et voir ton arbre en entier.
      0