Quelle est la meilleure structure de données pouvant être utilisée pour implémenter un arbre binaire en Python?
104
Quelle est la meilleure structure de données pouvant être utilisée pour implémenter un arbre binaire en Python?
Réponses:
Voici ma simple implémentation récursive de l'arbre de recherche binaire.
la source
node is not None
place de votre(node!=None)
. En outre, vous pouvez utiliser la__str__
fonction au lieu de la méthode printTree.def _find(self, val, node): if(val == node.v): return node elif(val < node.v and node.l != None): return self._find(val, node.l) elif(val > node.v and node.r != None): return self._find(val, node.r)
left<=root<=right
?En savoir plus ici: -Il s'agit d'une implémentation très simple d'un arbre binaire.
Ceci est un beau tutoriel avec des questions entre les deux
la source
insertLeft
est cassé et produira une boucle infinie sur toute tentative de traverser récursivement la branche la plus à gauche de l'arbre binaire[Ce dont vous avez besoin pour les interviews] Une classe Node est la structure de données suffisante pour représenter un arbre binaire.
(Alors que les autres réponses sont pour la plupart correctes, elles ne sont pas nécessaires pour un arbre binaire: pas besoin d'étendre la classe d'objets, pas besoin d'être un BST, pas besoin d'importer deque).
Voici un exemple d'arbre:
Dans cet exemple, n1 est la racine de l'arbre ayant n2, n3 comme enfants.
la source
Implémentation simple de BST en Python
la source
Une manière très rapide d'implémenter un arbre binaire en utilisant des listes. Ce n'est pas le plus efficace et il ne gère pas trop bien les valeurs nulles. Mais c'est très transparent (du moins pour moi):
Construire un arbre à partir d'un itérable:
Traverser un arbre:
la source
Je ne peux pas m'empêcher de remarquer que la plupart des réponses ici implémentent un arbre de recherche binaire. Arbre de recherche binaire! = Arbre binaire.
Un arbre de recherche binaire a une propriété très spécifique: pour tout nœud X, la clé de X est plus grande que la clé de tout descendant de son enfant gauche, et plus petite que la clé de tout descendant de son enfant droit.
Un arbre binaire n'impose aucune restriction de ce type. Un arbre binaire est simplement une structure de données avec un élément «clé» et deux enfants, disons «gauche» et «droite».
Un arbre est un cas encore plus général d'arbre binaire où chaque nœud peut avoir un nombre arbitraire d'enfants. En règle générale, chaque nœud a un élément 'children' qui est de type liste / tableau.
Maintenant, pour répondre à la question du PO, j'inclus une implémentation complète d'un arbre binaire en Python. La structure de données sous-jacente stockant chaque BinaryTreeNode est un dictionnaire, étant donné qu'elle offre des recherches O (1) optimales. J'ai également implémenté des traversées en profondeur d'abord et en largeur d'abord. Ce sont des opérations très courantes effectuées sur les arbres.
la source
vous n'avez pas besoin d'avoir deux cours
la source
Un peu plus "pythonique"?
la source
la source
Une
Node
classe basée sur des nœuds connectés est une approche standard. Ceux-ci peuvent être difficiles à visualiser.Motivé par un essai sur les modèles Python - Implémentation de graphiques , considérez un dictionnaire simple:
Donné
Un arbre binaire
Code
Créez un dictionnaire de nœuds uniques :
Détails
find_all_paths()
).Les fonctions basées sur une arborescence incluent souvent les opérations courantes suivantes:
Essayez de mettre en œuvre toutes ces opérations. Ici, nous démontrons l' une de ces fonctions - un parcours BFS:
Exemple
Il s'agit d'un algorithme de recherche en largeur (ordre de niveau) appliqué à un dict de nœuds et d'enfants.
deque
, mais aqueue
ou alist
fonctionne (ce dernier est inefficace).Voir également ce didacticiel détaillé sur les arbres.
Perspicacité
Quelque chose de génial à propos des traversées en général, nous pouvons facilement modifier cette dernière approche itérative de la recherche en profondeur d'abord (DFS) en remplaçant simplement la file d'attente par une pile (alias LIFO Queue). Cela signifie simplement que nous sortons de la file d'attente du même côté que nous mettons en file d'attente. DFS nous permet de rechercher chaque branche.
Comment? Puisque nous utilisons a
deque
, nous pouvons émuler une pile en modifiantnode = q.popleft()
ennode = q.pop()
(à droite). Le résultat est un droit favorisée, précommandé DFS :['a', 'c', 'f', 'b', 'e', 'd']
.la source
la source
Cette implémentation prend en charge les opérations d'insertion, de recherche et de suppression sans détruire la structure de l'arborescence. Ce n'est pas un arbre banlancé.
la source
Je sais que de nombreuses bonnes solutions ont déjà été publiées mais j'ai généralement une approche différente pour les arbres binaires: utiliser une classe Node et l'implémenter directement est plus lisible, mais lorsque vous avez beaucoup de nœuds, cela peut devenir très gourmand en mémoire, alors je suggérez d'ajouter une couche de complexité et de stocker les nœuds dans une liste python, puis de simuler un comportement d'arbre en utilisant uniquement la liste.
Vous pouvez toujours définir une classe Node pour finalement représenter les nœuds dans l'arborescence lorsque cela est nécessaire, mais les garder sous une forme simple [valeur, gauche, droite] dans une liste utilisera la moitié de la mémoire ou moins!
Voici un exemple rapide d'une classe d'arbre de recherche binaire stockant les nœuds dans un tableau. Il fournit des fonctions de base telles que l'ajout, la suppression, la recherche ...
J'ai ajouté un attribut parent afin que vous puissiez supprimer n'importe quel nœud et conserver la structure BST.
Désolé pour la lisibilité, en particulier pour la fonction "supprimer". En gros, lorsqu'un nœud est supprimé, nous pop le tableau d'arborescence et le remplaçons par le dernier élément (sauf si nous voulions supprimer le dernier nœud). Pour maintenir la structure BST, le nœud supprimé est remplacé par le max de ses enfants de gauche ou par le min de ses enfants de droite et certaines opérations doivent être effectuées afin de garder les index valides mais c'est assez rapide.
J'ai utilisé cette technique pour des choses plus avancées pour créer des dictionnaires de gros mots avec un trie radix interne et j'ai pu diviser la consommation de mémoire par 7-8 (vous pouvez voir un exemple ici: https://gist.github.com/fbparis / b3ddd5673b603b42c880974b23db7cda )
la source
Une bonne implémentation de l' arbre de recherche binaire , tirée d' ici :
la source
Je veux montrer une variante de la méthode de @ apadana, qui est plus utile lorsqu'il y a un nombre considérable de nœuds:
la source
la source
Arbre binaire en Python
la source
Voici une solution simple qui peut être utilisée pour construire un arbre binaire en utilisant une approche récursive pour afficher l'arbre dans l'ordre que la traversée a été utilisée dans le code ci-dessous.
Code extrait de: Arbre binaire en Python
la source