Nœud
Pour implémenter un Noeud en Java:
public class Node {
public int val;
public List<Node> children;
public Node(int val) {
this.val = val;
this.children = new ArrayList<>();
}
}
Type de parcours
Parcours en “profondeur d’abord”
Prenons cet arbre :
On peut implémenter ce parcours avec ce pseudo code :
type_retour parcours(Node n)
// Traitement 1/n
pour chaque fils de n
type_retour = parcours(fils)
// Tests sur val (optionnel)
si val == ...
sinon ...
fin si
fin pour
// Traitement (optionnel)
retourne valeur_defaut
Implémentation
contains
boolean contains(Node n, int val) {
if (n.val === val)
return true;
for (Node fils: n.children){
boolean rep = contains(fils, val);
if (rep) return true;
}
return false;
}
Obtenir la profondeur
Il existe deux façons de l’implémenter :
int treeDepth(Node n, int level){
if (n.children.size() < 1) return level;
int maxDepth = 0;
for (Node fils: n.children){
int d = treeDepth(fils, level + 1);
if (d > maxDepth) maxDepth = d;
}
return maxDepth;
}
Ou :
int treeDepth(Node n){
if (n.children.size() < 1)
return 1;
int maxDepth = 0;
for (Node fils: n.children){
int d = treeDepth(fils);
if (d > maxDepth) maxDepth = d;
}
return maxDepth + 1;
}
Parcours en profondeur d’abord
public List<Node> getNodePerLevel(Node n, int level){
List<Node> list = new ArrayList<>();
if (level == 0) {
list.add(n);
} else if (level > 0){
int current = 1;
Node separ = new node(-9999);
Queue<Node> queue = new ArrayQueue<>();
for (Node f: n.children) {
queue.offer(f);
}
queue.offer(separ);
while (!queue.isEmpty()){
Node p = queue.poll();
if (p == separ){
if (current == level)
return list;
else {
currentLevel += 1;
queue.offer(separ);
}
} else {
if (current == level) {
list.add(p);
} else {
for (Node f: p.children){
queue.offer(f);
}
}
}
}
// Fin du while
}
return list;
}
Obtenir la largeur maximale
public int nbNodesByLevel(Node n, int currentLevel, int searchLevel){
if (currentLevel == searchLevel) return 1;
int nb = 0;
for (Node f: n.children){
nb += nbNodesByLevel(f, currentLevel, searchLevel);
}
return nb;
}
public int maxWidth(Node n) {
int max = 0, width = 0, level = 0;
while ((width == nbNodesByLevel(n, 0, level)) > 0){
if (width > max) max = width;
level++;
}
}
Mais cette méthode n’est pas efficace, on va plutôt l’implémenter de cette manière:
public void countByLevel(Node n, int level, List<Integer> nbNodes){
if (nbNodes.size() < level) nbNodes.add(1);
else nbNodes.set(level, nbNodes.get(level) + 1);
for (Node f: n.childre) countByLevel(f, level + 1, nbNodes);
}
Arbre binaire ordonné
class Node {
Node left;
Node right;
int value;
public Node(value){
this.value = value;
left = null;
right = null;
}
}
public int insert(int value){
insertRecur(root, value);
}
private void insertRecur(Node n, int value){
if (n == null)
root = new Node(value);
else if (value <= n.value) {
if (n.left != null)
insertRecur()
}
}