Arbre - Axiomes

Fermé
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 - 16 déc. 2012 à 10:39
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 17 déc. 2012 à 20:27
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

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
16 déc. 2012 à 12:58
"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
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 49
16 déc. 2012 à 13:43
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
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
16 déc. 2012 à 13:59
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
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 49
17 déc. 2012 à 19:59
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
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
17 déc. 2012 à 20:27
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