diff --git a/CHANGELOG.md b/CHANGELOG.md index 56a4224..bfc86a1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [3.1.1] - 2020-04-01 +### Fixed +- use the same balancing algorithm for insert and remove. + ## [3.1.0] - 2020-03-31 ### Added - AvlTreeNode & AvlTree implementation. diff --git a/package.json b/package.json index b8093b5..36d50e4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datastructures-js/binary-search-tree", - "version": "3.1.0", + "version": "3.1.1", "description": "binary search tree & avl tree (self balancing tree) implementation in javascript", "main": "index.js", "scripts": { diff --git a/src/avlTree.js b/src/avlTree.js index 96df94b..211af6f 100644 --- a/src/avlTree.js +++ b/src/avlTree.js @@ -14,38 +14,10 @@ const AvlTreeNode = require('./avlTreeNode'); class AvlTree extends BinarySearchTree { /** * @private - * applies the proper rotation on nodes after inserting a node + * applies the proper rotation on nodes after an insert or remove * @param {AvlTreeNode} node */ - balanceAfterInsert(key, node) { - if (!node) return; - - node.updateHeight(); - const balance = node.calculateBalance(); - if (balance > 1) { - if (key < node.getLeft().getKey()) { - node.rotateRight(); - } else { - node.rotateLeftRight(); - } - } else if (balance < -1) { - if (key > node.getRight().getKey()) { - node.rotateLeft(); - } else { - node.rotateRightLeft(); - } - } - if (node === this.rootNode && (balance < -1 || balance > 1)) { - this.rootNode = node.getParent(); - } - } - - /** - * @private - * applies the proper rotation on nodes after removing a node - * @param {AvlTreeNode} node - */ - balanceAfterRemove(node) { + balanceNode(node) { if (!node) return; node.updateHeight(); @@ -110,12 +82,12 @@ class AvlTree extends BinarySearchTree { if (key < node.getKey()) { const newNode = this.insert(key, value, node.getLeft()); - this.balanceAfterInsert(key, node); // back-tracking + this.balanceNode(node); // back-tracking return newNode; } const newNode = this.insert(key, value, node.getRight()); - this.balanceAfterInsert(key, node); // back-tracking + this.balanceNode(node); // back-tracking return newNode; } @@ -124,13 +96,13 @@ class AvlTree extends BinarySearchTree { if (key < node.getKey()) { const removed = this.remove(key, node.getLeft()); - this.balanceAfterRemove(node); + this.balanceNode(node); return removed; } if (key > node.getKey()) { const removed = this.remove(key, node.getRight()); - this.balanceAfterRemove(node); + this.balanceNode(node); return removed; }