Parcours en profondeur d'un arbre binaire de recherche
Le parcours d'un arbre binaire de recherche se divise en deux grandes catégories : le parcours en profondeur et le parcours en largeur.
Le parcours en profondeur est divisé en trois types : le parcours préfixe d'arbre, le parcours infixe d'arbre et le parcours postfixe d'arbre, qui sont respectivement :
- 1. Parcours préfixe :Visitez d'abord le nœud actuel, puis parcourez récursivement les sous-arbres gauche et droit dans l'ordre.
- 2. Parcours infixe: Parcourez d'abord récursivement le sous-arbre gauche, puis visitez le nœud lui-même, puis parcourez récursivement le sous-arbre droit.
- 3. Parcours postfixe: Parcourez d'abord récursivement les sous-arbres gauche et droit, puis visitez le nœud actuel lui-même.
Diagramme du résultat du parcours préfixé :

Exemple de code correspondant :
...
// Effectuer un parcours préfixe sur l'arbre binaire de recherche enraciné à node, algorithme récursif
private void preOrder(Node node){
if( node != null ){
System.out.println(node.key);
preOrder(node.left);
preOrder(node.right);
}
}
...
// Effectuer un parcours préfixe sur l'arbre binaire de recherche enraciné à node, algorithme récursif
private void preOrder(Node node){
if( node != null ){
System.out.println(node.key);
preOrder(node.left);
preOrder(node.right);
}
}
...
Diagramme du résultat du parcours infixé :

Exemple de code correspondant :
...
// Effectuer un parcours infixe sur l'arbre binaire de recherche enraciné à node, algorithme récursif
private void inOrder(Node node){
if( node != null ){
inOrder(node.left);
System.out.println(node.key);
inOrder(node.right);
}
}
...
// Effectuer un parcours infixe sur l'arbre binaire de recherche enraciné à node, algorithme récursif
private void inOrder(Node node){
if( node != null ){
inOrder(node.left);
System.out.println(node.key);
inOrder(node.right);
}
}
...
Diagramme du résultat du parcours postfixé :

Exemple de code correspondant :
...
// Effectuer un parcours post-ordre sur l'arbre binaire de recherche dont la racine est node, algorithme récursif
private void postOrder(Node node){
if( node != null ){
postOrder(node.left);
postOrder(node.right);
System.out.println(node.key);
}
}
...
// Effectuer un parcours post-ordre sur l'arbre binaire de recherche dont la racine est node, algorithme récursif
private void postOrder(Node node){
if( node != null ){
postOrder(node.left);
postOrder(node.right);
System.out.println(node.key);
}
}
...
Exemple de code Java
Téléchargement du paquet de code source :Télécharger
Code du fichier src/example/binary/Traverse.java :
package example.binary;
/**
* Parcours prioritaire
*/
public class Traverse<Key extends Comparable<Key>, Value> {
// Les nœuds dans l'arbre sont une classe privée ; le monde extérieur n'a pas besoin de connaître l'implémentation spécifique des nœuds de l'arbre binaire de recherche
private class Node {
private Key key;
private Value value;
private Node left, right;
public Node(Key key, Value value) {
this.key = key;
this.value = value;
left = right = null;
}
}
private Node root; // Nœud racine
private int count; // Nombre de nœuds dans l'arbre
// Constructeur, construit un arbre binaire de recherche vide par défaut
public Traverse() {
root = null;
count = 0;
}
// Renvoie le nombre de nœuds dans l'arbre binaire de recherche
public int size() {
return count;
}
// Renvoie si l'arbre binaire de recherche est vide
public boolean isEmpty() {
return count == 0;
}
// Insère une nouvelle paire de données (key, value) dans l'arbre binaire de recherche
public void insert(Key key, Value value){
root = insert(root, key, value);
}
// Vérifie si key existe dans l'arbre binaire de recherche
public boolean contain(Key key){
return contain(root, key);
}
// Recherche dans l'arbre binaire de recherche la valeur correspondant à key. Si la valeur n'existe pas, renvoie null
public Value search(Key key){
return search( root , key );
}
// Parcours préfixe de l'arbre binaire de recherche
public void preOrder(){
preOrder(root);
}
// Parcours infixe de l'arbre binaire de recherche
public void inOrder(){
inOrder(root);
}
// Parcours postfixe de l'arbre binaire de recherche
public void postOrder(){
postOrder(root);
}
//********************
//* Fonctions utilitaires pour l'arbre binaire de recherche
//********************
// Insérer le nœud (key, value) dans l'arbre binaire de recherche enraciné au nœud node, en utilisant un algorithme récursif
// Retourne la racine de l'arbre binaire de recherche après l'insertion du nouveau nœud
private Node insert(Node node, Key key, Value value){
if( node == null ){
count ++;
return new Node(key, value);
}
if( key.compareTo(node.key) == 0 )
node.value = value;
else if( key.compareTo(node.key) < 0 )
node.left = insert( node.left , key, value);
else // key > node->key
node.right = insert( node.right, key, value);
return node;
}
// Vérifie si l'arbre binaire de recherche enraciné à node contient un nœud dont la valeur de clé est key, en utilisant un algorithme récursif
private boolean contain(Node node, Key key){
if( node == null )
return false;
if( key.compareTo(node.key) == 0 )
return true;
else if( key.compareTo(node.key) < 0 )
return contain( node.left , key );
else // key > node->key
return contain( node.right , key );
}
// Trouver la valeur correspondant à key dans l'arbre binaire de recherche enraciné à node, algorithme récursif
// Renvoyer NULL si la valeur n'existe pas
private Value search(Node node, Key key){
if( node == null )
return null;
if( key.compareTo(node.key) == 0 )
return node.value;
else if( key.compareTo(node.key) < 0 )
return search( node.left , key );
else // key > node->key
return search( node.right, key );
}
// Effectuer un parcours préfixe sur l'arbre binaire de recherche enraciné à node, algorithme récursif
private void preOrder(Node node){
if( node != null ){
System.out.println(node.key);
preOrder(node.left);
preOrder(node.right);
}
}
// Effectuer un parcours infixe sur l'arbre binaire de recherche enraciné à node, algorithme récursif
private void inOrder(Node node){
if( node != null ){
inOrder(node.left);
System.out.println(node.key);
inOrder(node.right);
}
}
// Effectuer un parcours post-ordre sur l'arbre binaire de recherche dont la racine est node, algorithme récursif
private void postOrder(Node node){
if( node != null ){
postOrder(node.left);
postOrder(node.right);
System.out.println(node.key);
}
}
}
/**
* Parcours prioritaire
*/
public class Traverse<Key extends Comparable<Key>, Value> {
// Les nœuds dans l'arbre sont une classe privée ; le monde extérieur n'a pas besoin de connaître l'implémentation spécifique des nœuds de l'arbre binaire de recherche
private class Node {
private Key key;
private Value value;
private Node left, right;
public Node(Key key, Value value) {
this.key = key;
this.value = value;
left = right = null;
}
}
private Node root; // Nœud racine
private int count; // Nombre de nœuds dans l'arbre
// Constructeur, construit un arbre binaire de recherche vide par défaut
public Traverse() {
root = null;
count = 0;
}
// Renvoie le nombre de nœuds dans l'arbre binaire de recherche
public int size() {
return count;
}
// Renvoie si l'arbre binaire de recherche est vide
public boolean isEmpty() {
return count == 0;
}
// Insère une nouvelle paire de données (key, value) dans l'arbre binaire de recherche
public void insert(Key key, Value value){
root = insert(root, key, value);
}
// Vérifie si key existe dans l'arbre binaire de recherche
public boolean contain(Key key){
return contain(root, key);
}
// Recherche dans l'arbre binaire de recherche la valeur correspondant à key. Si la valeur n'existe pas, renvoie null
public Value search(Key key){
return search( root , key );
}
// Parcours préfixe de l'arbre binaire de recherche
public void preOrder(){
preOrder(root);
}
// Parcours infixe de l'arbre binaire de recherche
public void inOrder(){
inOrder(root);
}
// Parcours postfixe de l'arbre binaire de recherche
public void postOrder(){
postOrder(root);
}
//********************
//* Fonctions utilitaires pour l'arbre binaire de recherche
//********************
// Insérer le nœud (key, value) dans l'arbre binaire de recherche enraciné au nœud node, en utilisant un algorithme récursif
// Retourne la racine de l'arbre binaire de recherche après l'insertion du nouveau nœud
private Node insert(Node node, Key key, Value value){
if( node == null ){
count ++;
return new Node(key, value);
}
if( key.compareTo(node.key) == 0 )
node.value = value;
else if( key.compareTo(node.key) < 0 )
node.left = insert( node.left , key, value);
else // key > node->key
node.right = insert( node.right, key, value);
return node;
}
// Vérifie si l'arbre binaire de recherche enraciné à node contient un nœud dont la valeur de clé est key, en utilisant un algorithme récursif
private boolean contain(Node node, Key key){
if( node == null )
return false;
if( key.compareTo(node.key) == 0 )
return true;
else if( key.compareTo(node.key) < 0 )
return contain( node.left , key );
else // key > node->key
return contain( node.right , key );
}
// Trouver la valeur correspondant à key dans l'arbre binaire de recherche enraciné à node, algorithme récursif
// Renvoyer NULL si la valeur n'existe pas
private Value search(Node node, Key key){
if( node == null )
return null;
if( key.compareTo(node.key) == 0 )
return node.value;
else if( key.compareTo(node.key) < 0 )
return search( node.left , key );
else // key > node->key
return search( node.right, key );
}
// Effectuer un parcours préfixe sur l'arbre binaire de recherche enraciné à node, algorithme récursif
private void preOrder(Node node){
if( node != null ){
System.out.println(node.key);
preOrder(node.left);
preOrder(node.right);
}
}
// Effectuer un parcours infixe sur l'arbre binaire de recherche enraciné à node, algorithme récursif
private void inOrder(Node node){
if( node != null ){
inOrder(node.left);
System.out.println(node.key);
inOrder(node.right);
}
}
// Effectuer un parcours post-ordre sur l'arbre binaire de recherche dont la racine est node, algorithme récursif
private void postOrder(Node node){
if( node != null ){
postOrder(node.left);
postOrder(node.right);
System.out.println(node.key);
}
}
}