Problème avec l'insertion des trees ! (Urg)

levenimeux
Problème avec l'insertion des trees ! (Urg)

Svp je suis bloqué a l'insertion d'une arbre, j'ai pas sû comment inserer des characters a la "Breadth First", mon probleme et d'inserer des expression mathematique ds une "binary tree" equilibrée ! et dc j'ai pensé a mettre les nombres ds un array, et les operateurs ds un autre, apres je voulais prendre le middle du tableau des operateurs pr la mettre comme le root de l'arbre, les operateurs qui viennent apres le middle je voulais les mettre dans la "right subtree", et les autres qui sont apres le middle ds la "left subtree". apres je voulais mettre les nombres dans les leaf de gauche a droite ! dc je voulais savoir si kelk'1 a une methode d'insertion par niveau (level) genre tu insere le root, apres tu insere ds root.rightchild, apres root.leftchild, apres c root.rightchild.rightchild, apres root.rightchild.leftchild, apres (et c ou ya la complication) c root.LEFTchild.rightchild, apres c root.LEFTchild.leftchild.....etc

fredericmazue

Quote:
dc je voulais savoir si kelk'1 a une methode d'insertion par niveau (level) genre tu insere le root

Des méthodes j'en vois deux

- D'abord au lieu d'un array tu peux utiliser la classe javax.swing.tree.TreeModel et les classes acssociées (TreeNode, ...). A la base ces classes servent pour contenir les données devant être afficher dans le composants JTree, mais pourquoi ne pas les employer à autre chose :) A priori c'est une structure de données plus adaptée à ce que tu veux faire que le tableau (tu as dit arrays) Sinon bricoler avec des ArrayList plutôt que des tableaux bruts. Ou encore créer toi même la structure de données adaptée à ton besoin.

- Mais la méthode que je préconise, c'est de faire ça en quelque lignes et avec facilité, avec un vrai langage, qui a des capacités d'expressions adaptées à ce travail. Lisp ou Haksell par exemple. (Liste non limitative) :)
Java... pffff...

levenimeux

oui je vois ske tu veux dire fredericmazue, mais le probleme c que c un projet a rendre, dc c l'ecole qui impose le language :), pr le probleme, c que on t'impose aussi de ne pas utulisé "predefined classes"; genre on doi tt implementé tt seul ! je peux t'envoyé mon code pr jeter un coup d'oeil si tu veux ! ma methode doit etre recursive, et elle doit trouver le most right leaf par viveau, et inserer le character dedans ! kon le niveau est complet il passe o suivant !

Merci comm mm fredericmazue, j'appreci :)

fredericmazue

Recherche sur ce forum, quelqu'un a fait un exercice de ce genre et il a donnhé des bouts de code

levenimeux

j'ai cherché j'ai pas trouver, dc si ta le nom exact du msg tu me laisse stp ! merci !

fredericmazue

Quote:
j'ai cherché j'ai pas trouver, dc si ta le nom exact du msg tu me laisse stp ! merci !

Je ne sais plus.

Ah au fait:

Quote:
oui je vois ske tu veux dire fredericmazue, mais le probleme c que c un projet a rendre, dc c l'ecole qui impose le language , pr le probleme, c que on t'impose aussi de ne pas utulisé "predefined classes"; genre on doi tt implementé tt seul ! je peux t'envoyé mon code pr jeter un coup d'oeil si tu veux ! ma methode doit etre recursive, et elle doit trouver le most right leaf par viveau, et inserer le character dedans ! kon le niveau est complet il passe o suivant !

Puisqu'on parle d'imposition de langage, en tant que modérateur et aussi parce que ça me démange en tant qu'ours grincheux (ce que chacun ici sait que je suis), je t'impose de poster tes messages en français. Parce que tout ce que tu racontes, je n'y comprends goutte. Et aussi parce que quand on vient demander de l'aide sur un forum, cela implique que ceux qui vont aider vont consacrer du temps et des efforts, donc la moindre des choses est de faire un effort minimum en exposant correctement le problème.

Reprenons donc ce problème. Déjà je trouve ça bizarre:

Quote:
mon probleme et d'inserer des expression mathematique ds une "binary tree" equilibrée

Si insertion d'opérateurs mathématiques il y a je trouve suspect que l'arbre doive être balancé (ou équilibré)
Donc je me demande s'il n'y a pas déjà à la base une confusion entre arbre binaire et arbre balancé ?
Niroken
Une aide:)

Bien donc je suis parti du principe que tu voulais un arbre
binaire d'expression mathématique avec le plus de noeuds
droit possible par niveau, ce qui revient a dire selon moi
que tu cherches a équilibrer ton arbre.

J'ai donc pour l'occasion codé qq chose qui peut répondre à ton
problème, je n'ai pas détaillé ma pensée mais si tu le souhaites
je t'aiderais.

Voici le code :

import java.io.*;
import java.util.regex.*;

public class MyTree
{
	String[] mathExpr;
	MyNode rootNode;
	
	public MyTree(String[] mathExpr_arg)
	{
		mathExpr = mathExpr_arg;
		rootNode = new MyNode();
	}
	
	public void ParcoursMyTreeForAff(MyNode currentNode, int niveau)
	{
		System.out.println("Noeud de niveau : " + niveau + " data : "+ currentNode.data);
		
		if (currentNode.leftChildNode != null)
		{
			ParcoursMyTreeForAff(currentNode.leftChildNode, (niveau + 1));
		}
		
		if (currentNode.rightChildNode != null)
		{
			ParcoursMyTreeForAff(currentNode.rightChildNode, (niveau + 1));
		}
	}
	
	public void FillMyTree(String[] datasToLeft, String[] datasToRight, String data, MyNode currentNode)
	{
		currentNode.data = data;
		
		if (datasToLeft.length > 1)
		{
			currentNode.leftChildNode = new MyNode();
			currentNode.parentNode = currentNode;
			FillMyTree(CutMathExprInTwo(datasToLeft)[0], CutMathExprInTwo(datasToLeft)[1], CutMathExprInTwo(datasToLeft)[2][0], currentNode.leftChildNode);
		}
		if (datasToRight.length > 1)
		{
			currentNode.rightChildNode = new MyNode();
			currentNode.parentNode = currentNode;
			FillMyTree(CutMathExprInTwo(datasToRight)[0], CutMathExprInTwo(datasToRight)[1], CutMathExprInTwo(datasToRight)[2][0], currentNode.rightChildNode);
		}
		if (datasToLeft.length == 1)
		{
			currentNode.leftChildNode = new MyNode();
			currentNode.parentNode = currentNode;
			currentNode.leftChildNode.data = datasToLeft[0];
		}
		if (datasToRight.length == 1)
		{
			currentNode.rightChildNode = new MyNode();
			currentNode.parentNode = currentNode;
			currentNode.rightChildNode.data = datasToRight[0];
		}
	}
	
	public String[][] CutMathExprInTwo(String[] mathExprCurrent)
	{
		String[][] myDecoupage = new String[3][];
		
		//System.out.println("" + (mathExprCurrent.length / 2));
		
		if (!mathExprCurrent[mathExprCurrent.length / 2].matches("[0-9]+"))
		{
			myDecoupage[0] = new String[mathExprCurrent.length / 2];
			myDecoupage[1] = new String[mathExprCurrent.length / 2];
			myDecoupage[2] = new String[1];
			
			for (int i = 0; i < mathExprCurrent.length; i++)
			{
				if (i < mathExprCurrent.length / 2)
				{
					myDecoupage[0][i] = mathExprCurrent[i];
				}
				if (i > mathExprCurrent.length / 2)
				{
					myDecoupage[1][i - (mathExprCurrent.length / 2) - 1] = mathExprCurrent[i];
				}
				myDecoupage[2][0] = mathExprCurrent[(mathExprCurrent.length / 2)];
			}
		}
		if (mathExprCurrent[mathExprCurrent.length / 2].matches("[0-9]+"))
		{
			myDecoupage[0] = new String[(mathExprCurrent.length / 2) + 1];
			myDecoupage[1] = new String[(mathExprCurrent.length / 2) - 1];
			myDecoupage[2] = new String[1];
		
			for (int i = 0; i < mathExprCurrent.length; i++)
			{
				if (i < (mathExprCurrent.length / 2) + 1)
				{
					myDecoupage[0][i] = mathExprCurrent[i];
				}
				if (i > (mathExprCurrent.length / 2) + 1)
				{
					myDecoupage[1][i - (mathExprCurrent.length / 2) - 2] = mathExprCurrent[i];
				}
				myDecoupage[2][0] = mathExprCurrent[(mathExprCurrent.length / 2) + 1];
			}
		}
		
		return myDecoupage;
	}
	
	public void AffTab2D(String[][] tab2D)
	{
		for (int i = 0; i < tab2D.length; i++)
		{	
			for (int j = 0; j < tab2D[i].length; j++)
			{
				System.out.print(tab2D[i][j] + " ");
			}
		
			System.out.println("");
		}
	}
	
	public static void main(String[] args)
	{
		String[] test = new String[7];
		test[0] = "0";
		test[1] = "+";
		test[2] = "1";
		test[3] = "-";
		test[4] = "2";
		test[5] = "+";
		test[6] = "2";
		
		MyTree newTree = new MyTree(test); 
		newTree.FillMyTree(newTree.CutMathExprInTwo(test)[0], newTree.CutMathExprInTwo(test)[1], newTree.CutMathExprInTwo(test)[2][0], newTree.rootNode);
		newTree.ParcoursMyTreeForAff(newTree.rootNode, 0);
		//newTree.AffTab2D(newTree.CutMathExprInTwo(test));
	}
}

class MyNode
{
	MyNode rightChildNode;
	MyNode leftChildNode;
	MyNode parentNode;
	String data;
}

Bonne chance

fredericmazue

Quote:
tu voulais un arbre
binaire d'expression mathématique avec le plus de noeuds
droit possible par niveau, ce qui revient a dire selon moi
que tu cherches a équilibrer ton arbre.

Ou bien je ne te suis pas, ou bien tu as une curieuse vision d'un arbre équilibré.
Niroken
Hmmm

Je m'explique.

Telle que je vois les choses un arbre binaire équilibré total de profondeur
n a son niveau n-1 complètement rempli.

Dans son cas précis il veut un maximum de fils droit par niveau
je ne vois pas comment il peut atteindre ce résultat sans chercher
à équilibrer son arbre....

Bon si bien sur il n'a pas suffisamment d élément pour remplir le
dernier niveau il aura donc un arbre d'éequilibre partiel

Ma source : [url]http://fr.wikipedia.org/wiki/Arbre_équilibré[/url]

Voila, si jamais je me suis trompé n'hésites pas:)

Niroken

Ou alors je me suis rendu compt que ce qu'il cherchait
à obtenir un arbre complet.

Les deux ont un rendu assez similaire je crois.

Quoi qu'il en soit :

Le rendu de mon code est le suivant:
étape 1:
->il découpe l'expression mathématiques en deux
->recherche si l'opérateur est au milieu ou non
->il affecte l'opérateur au noeud courant
étape 2:
->il passe les expressions découpées respectivement
->aux noeuds fils gauche puis droit
->pour ces noeuds on répète l'opération 1.
->Condtion d'arret : mon expression mathématiques
->pour un noeud est de longueur 1->hop on la stocke
->sur ce noeud

Avec le code présenté ci-dessus:
->On obtient les chiffres aux noeuds feuilles
->les opérateurs aux noeuds non feuilles.
->Et en découpant en deux a chaque fois on est sur
->d' otenir un arbre complet au moins au niveau n - 1.

Bon ensuite comme la demande de levenimeux n'était
pas très claire non plus j'ai composé avec ce que j'ai
compris.

fredericmazue

Quote:
Telle que je vois les choses un arbre binaire équilibré total de profondeur
n a son niveau n-1 complètement rempli.

Alors il n'est pas équilibré.

Quote:
Dans son cas précis il veut un maximum de fils droit par niveau

Je ne vois pas d'où tu sors ça.

Quote:
Bon si bien sur il n'a pas suffisamment d élément pour remplir le
dernier niveau il aura donc un arbre d'éequilibre partiel

:lol:
Un équilibre partiel n'est pas un équilibre ;)

Wikipedia c'est vraiment très bien, mais parfois on y trouve des choses bizarres.
Selon moi un arbre est équilibré si toutes ses feuilles sont à un même niveau de profondeur. Si ce n'est pas la cas, il n'est pas équilibré. Le partiellement équilibré n'existant pas à ma connaissance :)
Et tu peux voir ça aussi à Wikipedia (anglais)
http://en.wikipedia.org/wiki/B-tree
J'en cite un bout
Quote:
A B-tree is kept balanced by requiring that all leaf nodes are at the same depth. This depth will increase slowly as elements are added to the tree, but an increase in the overall depth is infrequent, and results in all leaf nodes being one more hop further removed from the root.

Comme tu vois le niveau de profondeur des feuilles est requis, sinon tu n'as pas un arbre équilibré.
Quote:
Ou alors je me suis rendu compt que ce qu'il cherchait
à obtenir un arbre complet.

Ben oui, un arbre binaire tout simplement

Quote:
Les deux ont un rendu assez similaire je crois.

Non. Enfin ça dépend de que tu entends par similaire :)
Quote:
Posté le: Mer Juin 06, 2007 7:35 pm Sujet du message:

--------------------------------------------------------------------------------

Ou alors je me suis rendu compt que ce qu'il cherchait
à obtenir un arbre complet.

Les deux ont un rendu assez similaire je crois.

Quoi qu'il en soit :

Le rendu de mon code est le suivant:
étape 1:
->il découpe l'expression mathématiques en deux
->recherche si l'opérateur est au milieu ou non
->il affecte l'opérateur au noeud courant
étape 2:
->il passe les expressions découpées respectivement
->aux noeuds fils gauche puis droit
->pour ces noeuds on répète l'opération 1.
->Condtion d'arret : mon expression mathématiques
->pour un noeud est de longueur 1->hop on la stocke
->sur ce noeud

Avec le code présenté ci-dessus:
->On obtient les chiffres aux noeuds feuilles
->les opérateurs aux noeuds non feuilles.


Tout ça est impeccable. Et c'est un arbre binaire

Quote:
->Et en découpant en deux a chaque fois on est sur
->d' otenir un arbre complet au moins au niveau n - 1.

Non:
(1 + (2 + (3 + (4 + (5 + (6 + (7 + (8 + 9))))))))
Comment c'est équilibré (ou complet si c'est ce que tu as voulu dire) au niveau n-1 ?

Quote:
Bon ensuite comme la demande de levenimeux n'était
pas très claire non plus j'ai composé avec ce que j'ai
compris.

Pas clair, je ne te le fais pas dire. J'ai moi même compris qu'il voulait constituer un arbre binaire, mais je n'ai pas bien suivi son histoire de racine. S'il veut bien poser sa question dans un français intelligible....

Quoi qu'il en soit je rends hommage à tes consistantes contributions à ce forum. J'espère que nous aurons souvent le plaisir de discuter ensemble :)

Niroken

Quote:
ma methode doit etre recursive, et elle doit trouver le most right leaf par viveau, et inserer le character dedans ! kon le niveau est complet il passe o suivant !

most right leaf par "viveau"-> on va dire que c'était mon point de départ:)

Le truk c 'est que la définition d'une expression mathématique
n'étant pas fourni pas levenimeux, j'ai pris un une expression
mathématiques la plus simple possible dans toute sa splendeur
à savoir pas de parenthèse et non respect des règles de précé-
densce, (c'est que je travaille aussi moi lol).

Effectivement s'il faut tenir compte de tt cela, ça complique le
projet et lui proposer une solution me prendra plus de temps:)

Le plus simple -> qu'il poste son énoncé ca ira plus vite :)

Sinon j'ai été voir sur le wiki anglais pour les arbres équilibrés,
c'est vrai que c'est pas tout à fait pareil.
De plus j'ai du faire une confusion entre arbres équilibrés et arbres complets.

fredericmazue

Quote:
most right leaf par "viveau"-> on va dire que c'était mon point de départ:)

Je comprends.
Mais il me semble que ton point de départ aurait du être " fonction récursive" et "trouver". C'est plus dans l'exploitation de l'arbre que dans sa constitution qu'il a problème.

Oui qu'il donne son énoncé et surtout qu'il s'exprime dans une français intelligible (là ca va être dur je le crains)

Niroken

Quote:
Mais il me semble que ton point de départ aurait du être " fonction récursive" et "trouver".

En ragrdant bien mon code notemment dans les fonctions
"FillTree" et "ParcoursTree" j'ai utilisé la récursivité pour
la construction et le parcours.

Quand à ce que je "trouve", ce sont les élements trouvés du
tableau représentant la fonction mathématiques, je les stocke
directement dans les noeuds concernés.

Bon après evidemment mon code ne répond peut etre pas l'énoncé
pour cause de mystère, mais il me semble que ca constitue un point
de départ dans la construction d'arbre binaire :wink:

Pour les peaufinages il utilisera un peu d'huile de coude. :D

fredericmazue

Quote:
En ragrdant bien mon code notemment dans les fonctions
"FillTree" et "ParcoursTree" j'ai utilisé la récursivité pour
la construction et le parcours.

Argh, je me suis mal exprimé :oops:
Rien à dire sur ton code.
Quand je parlais de prendre le bon point de départ, je parlais de comprendre le besoin de levenimeux, le point qui lui posait difficulté. En aucun cas, je ne voulais faire une critique indirecte à ton code. Mille pardons vraiment :oops:
Quote:
mais il me semble que ca constitue un point
de départ dans la construction d'arbre binaire

Je pense bien.
Quote:
Pour les peaufinages il utilisera un peu d'huile de coude.

Tu crois qu'il sait ce que c'est ? ;)