Exercice n°1
- Créez le fichier Node.java à partir du code ci-dessous, et complétez aux endroits indiqués.
import java.util.*;
class Node {
public List<Node> children;
public int value;
public Node(int value) {
this.value = value;
children = new ArrayList<Node>();
}
/* addChild(int value) :
créer un nouveau noeud contenant value
et l'ajoute comme fils au noeud courant
renvoie le nouveau noeud
*/
public Node addChild(int value) {
// à compléter
}
/* addChild(Node n) :
ajoute n comme fils au noeud courant
*/
public void addChild(Node n) {
// à compléter
}
/* getChild(int index) :
si index <0 ou >= taille list, renvoie null
sinon renvoie le fils en index
*/
public Node getChild(int index) {
// à compléter
}
}
Exercice n°2
- Créez le fichier Tree.java à partir du code ci-dessous et complétez les méthodes en suivant les indications.
import java.util.*;
class Tree {
public Node root;
public int nbNodes; // pas nécessaire mais utile
public Tree() {
root = null;
nbNodes = 0;
}
public Node addNode(int value, Node parent) {
/*
- si parent est null :
- créer un nouveau noeud contenant value
- si root existe déja : ajouter root comme fils du nouveau noeud
- root devient le nouveau noeud
- incrémenter le nombre de noeud
- renvoyer le nouveau noeud
- sinon si l'arbre contient parent
- ajouter un noeud fils à parent, contenant value
- incrémenter le nombre de noeud
- renvoyer le nouveau noeud
- sinon renvoyer null
*/
}
public Node contains(Node toSearch, Node parent) {
// NB : la recherche doit se faire en profondeur d'abord
}
public Node searchValueByLevel(int value, Node parent) {
// NB : la recherche doit se faire en largeur d'abord */
}
public Node searchValueByDepth(int value, Node parent) {
// NB : la recherche doit se faire en profondeur d'abord */
}
public Node searchValue(int value, int type) {
Node n = null;
if (type == 1) n = searchValueByDepth(value, root);
else if (type == 2) n = searchValueByLevel(value, root);
return n;
}
public void print() {
if (root != null) {
printNode(root,0);
}
}
public void printNode(Node n,int level) {
/*
- afficher 2*level espace puis la valeur contenue dans n
- pour chaque noeud fils de n :
- afficher le contenu du noeud, en incrémentant le niveau
*/
}
}
Pour tester les deux classes ainsi créées, utilisez le code suivant :
class TestTree {
public static void main(String[] args) {
Tree tree = new Tree();
Node root = tree.addNode(20,null); // création racine
root = tree.addNode(10,null); // test remplacement racine
Node n1 = tree.addNode(21,root);
n1.addChild(30);
Node n2 = n1.addChild(31);
Node n3 = n1.addChild(32);
n2.addChild(40);
n2 = n2.addChild(41);
n3.addChild(45);
n3.addChild(46);
Node n4 = n3.addChild(47);
n4.addChild(50);
n4 = n4.addChild(51);
tree.print();
Node s = tree.contains(n3,root);
if (s != n3) {
System.out.println("echec recherche du noeud contenant 32");
}
s = tree.contains(n2,root);
if (s != n2) {
System.out.println("echec recherche du noeud contenant 41");
}
s = tree.contains(n4,root);
if (s != n4) {
System.out.println("echec recherche du noeud contenant 51");
}
s = tree.searchValue(45,1); // recherche en profondeur
if (s.value != 45) {
System.out.println("echec recherche valeur 45");
}
s = tree.searchValue(50,2); // recherche en largeur
if (s.value != 50) {
System.out.println("echec recherche valeur 50");
}
s = tree.searchValue(60,1); // recherche en profondeur
if (s != null) { // si on trouve qq chose = pas normal
System.out.println("echec recherche valeur 60");
}
}
}
Normalement, l'exécution produit l'affichage suivant :
affichage de l'arbre en profondeur
10
20
21
30
31
40
41
32
45
46
47
50
51
Exercice n°3
- Inspirez vous de la méthode searchValueByLevel() pour créer une méthode printLevel() permettant de parcourir l'arbre en largeur.
- Normalement, l'appel à tree.printLevel() dans TestTree doit donner le résultat suivant :
10
20
21
30
31
32
40
41
45
46
47
50
51