Maison >développement back-end >Tutoriel Python >Comment implémenter un arbre de recherche binaire en Python

Comment implémenter un arbre de recherche binaire en Python

WBOY
WBOYoriginal
2023-06-10 08:57:131349parcourir

Binary Search Tree (BST) est un algorithme de recherche basé sur des arbres binaires. Sa caractéristique est que la valeur dans le sous-arbre gauche de chaque nœud de l'arbre est inférieure à la valeur de ce nœud, tandis que la valeur dans le sous-arbre droit est supérieure à la valeur de ce nœud. Par conséquent, la complexité temporelle des opérations de recherche et d’insertion BST est O(logN).

La méthode d'implémentation d'un arbre de recherche binaire en Python est relativement simple, car Python possède deux structures de données intégrées, des listes et des dictionnaires, qui peuvent toutes deux être utilisées pour implémenter des arbres binaires. Nous expliquerons ici comment implémenter un arbre de recherche binaire à l'aide de listes.

Tout d'abord, nous devons définir une classe Node pour représenter la valeur, le sous-arbre gauche et le sous-arbre droit de chaque nœud :

class Node:
    def __init__(self, value):
        self.value = value
        self.left = None
        self.right = None

Ensuite, nous pouvons définir une classe d'arbre de recherche binaire, qui contient deux méthodes : Insert et search. Dans la méthode d'insertion, nous partons du nœud racine et comparons les valeurs des nœuds un par un. Si la valeur nouvellement insérée est inférieure à la valeur du nœud actuel, continuez à chercher dans le sous-arbre de gauche, sinon recherchez. dans le sous-arbre de droite. Lorsque le sous-arbre gauche (ou droit) d'un nœud s'avère vide, cela signifie que le nœud à insérer doit être placé à cette position.

class BinarySearchTree:
    def __init__(self):
        self.root = None
    
    def insert(self, value):
        new_node = Node(value)
        if self.root is None:
            self.root = new_node
        else:
            current_node = self.root
            while True:
                if value <= current_node.value:
                    if current_node.left is None:
                        current_node.left = new_node
                        break
                    else:
                        current_node = current_node.left
                else:
                    if current_node.right is None:
                        current_node.right = new_node
                        break
                    else:
                        current_node = current_node.right
    
    def search(self, value):
        current_node = self.root
        while current_node is not None:
            if value == current_node.value:
                return True
            elif value < current_node.value:
                current_node = current_node.left
            else:
                current_node = current_node.right
        return False

Maintenant, nous pouvons créer un arbre et insérer plusieurs nœuds, puis tester la fonction de recherche :

bst = BinarySearchTree()
bst.insert(9)
bst.insert(3)
bst.insert(12)
bst.insert(1)
bst.insert(4)
bst.insert(10)
bst.insert(15)

print(bst.search(4))  # True
print(bst.search(7))  # False

Vous pouvez voir que pour cet arbre de recherche binaire, lorsque nous recherchons 4, True est renvoyé à 7, False est renvoyé ; renvoyé, indiquant que 7 n'est pas dans l'arborescence.

Lors de la mise en œuvre d'un arbre de recherche binaire, vous devez faire attention à certains problèmes. Premièrement, la complexité temporelle des opérations d'insertion et de recherche dépend de la hauteur de l'arbre, donc dans les opérations pratiques, il est très important de maintenir la hauteur de l'arbre aussi petite que possible. Deuxièmement, pour les grands ensembles de données, l'arbre de recherche binaire peut devenir déséquilibré (c'est-à-dire ressembler davantage à une liste qu'à un arbre), ce qui entraîne une recherche plus lente, de sorte que des algorithmes plus avancés tels que des arbres de recherche binaires équilibrés sont nécessaires pour optimiser les performances.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn