Cet article présente principalement l'exemple de code de l'arbre de recherche binaire de l'algorithme javascript. Il a certaines références et valeurs pour l'apprentissage de JavaScript. Les amis intéressés par JavaScript peuvent se référer à cet article. >
Qu'est-ce qu'un arbre binaire
Un arbre binaire signifie que chaque nœud de l'arbre ne peut avoir qu'au plus deux nœuds enfantsQu'est-ce que un arbre de recherche binaire
Basé sur l'arbre binaire, l'arbre de recherche binaire a une condition supplémentaire, c'est-à-dire lors de l'insertion d'une valeur dans l'arbre binaire, si la valeur insérée est plus petite que le nœud actuel , il est inséré dans le nœud gauche, sinon il est inséré dans le nœud droit ; Si pendant le processus d'insertion, le nœud gauche ou le nœud droit existe déjà, continuez à comparer selon les règles ci-dessus jusqu'à ce qu'un nouveau nœud soit rencontré.Caractéristiques des arbres de recherche binaires
En raison de sa structure de données unique, l'arbre de recherche binaire a une complexité temporelle de O, qu'il s'agisse d'ajout, de suppression ou de recherche (. h), h est la hauteur de l'arbre binaire. Par conséquent, l’arbre binaire doit être aussi court que possible, c’est-à-dire que les nœuds gauche et droit doivent être aussi équilibrés que possible.Construction d'un arbre de recherche binaire
Pour construire un arbre de recherche binaire, vous devez d'abord construire la classe de nœuds de l'arbre binaire. Il ressort des caractéristiques des arbres binaires que chaque classe de nœuds a un nœud gauche, un nœud droit et la valeur elle-même, donc les classes de nœuds sont les suivantes :class Node { constructor(key) { this.key = key; this.left = null; this.right = null; } }
class Tree{ constructor(param = null) { if (param) { this.root = new Node(param); } else { this.root = null; } } }
actuel .
Le de l'arbre de recherche binaire est nouvellement ajouté
Le sous-arbre gauche de l'arbre de recherche binaire est plus petit que le nœud, et le sous-arbre droit Le sous-arbre est plus grand que le nœud Fonctionnalités, vous pouvez facilement écrire l'algorithme pour ajouter un nouvel arbre de recherche binaire, comme suit :insert(key) { if (this.root === null) { this.root = new Node(key); } else { this._insertNode(this.root, key); } } _insertNode(node, key) { if (key < node.key) { if (node.left === null) { node.left = new Node(key);{1} } else { this._insertNode(node.left, key);{2} } } else if (key > node.key) { if (node.right === null) { node.right = new Node(key);{3} } else { this._insertNode(node.right, key);{4} } } }
Parcours d'arbre de recherche binaire
Les arbres de recherche binaires sont divisés en trois méthodes de parcours : pré-commande, mi-commande et post-commande.inOrderTraverse(callback) { this._inOrderTraverse(this.root, callback); } _inOrderTraverse(node, callback) { if (node) { this._inOrderTraverse(node.left, callback); callback(node.key); this._inOrderTraverse(node.right, callback); } }
Recherche dans l'arbre de recherche binaire
La recherche est très simple. Le jugement de boucle est effectué sur la base du principe selon lequel le nœud enfant gauche est plus petit que le nœud et le nœud droit. Le nœud enfant est plus grand que le nœud Can.search(value) { if (this.root) { if (value === this.root.key) { return true; } else { return this._searchNode(value, this.root); } } throw new Error('this.root 不存在'); } _searchNode(value, node) { if (!node) { return false; } if (value === node.key) { return true; } if (value > node.key) { return this._searchNode(value, node.right); } else if (value < node.key) { return this._searchNode(value, node.left); } }
Suppression de l'arbre de recherche binaire
La suppression est plus compliquée et doit être jugée en fonction de différentes situationsremove(key) { this._removeNode(this.root, key); } _removeNode(node, value) { if (!node) { return null; } if (value > node.key) { node.right = this._removeNode(node.right, value); } else if (value < node.key) { node.left = this._removeNode(node.left, value); } else { // 如果没有左子树,那么将右子树根节点作为替换节点 if (!node.left) { return node.right; // 如果存在左子树,那么取右子树最小节点作为替换节点 } else if (node.left) { return this._minNode(node.right); } } }
Résumé
En général, grâce à cette simple étude des arbres de recherche binaires, j'ai réappris ma compréhension. ne sont que quelques concepts théoriques simples. Cette pratique approfondie a beaucoup approfondi ma compréhension de la récursivité.Partage des différences entre trois méthodes d'encapsulation d'implémentation de simulation JavaScript et leur écriture
Explication détaillée des fonctions auto-exécutables JavaScript et des méthodes d'extension jQuery
Explication des exemples d'appels Require js en JavaScript
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!