From 90b56bc3d36a05b67cf10d0ddd237fe03e679a15 Mon Sep 17 00:00:00 2001 From: Oleksii Trekhleb Date: Sat, 2 Jun 2018 22:11:01 +0300 Subject: [PATCH] Fix issue #37 with AVL tree. --- src/data-structures/tree/avl-tree/AvlTree.js | 11 +++++ src/data-structures/tree/avl-tree/README.md | 1 + .../tree/avl-tree/__test__/AvlTRee.test.js | 44 +++++++++++++++++++ 3 files changed, 56 insertions(+) diff --git a/src/data-structures/tree/avl-tree/AvlTree.js b/src/data-structures/tree/avl-tree/AvlTree.js index 204bc83b..b4b86ea4 100644 --- a/src/data-structures/tree/avl-tree/AvlTree.js +++ b/src/data-structures/tree/avl-tree/AvlTree.js @@ -80,6 +80,12 @@ export default class AvlTree extends BinarySearchTree { const leftRightNode = leftNode.right; leftNode.setRight(null); + // Preserve leftRightNode's left subtree. + if (leftRightNode.left) { + leftNode.setRight(leftRightNode.left); + leftRightNode.setLeft(null); + } + // Attach leftRightNode to the rootNode. rootNode.setLeft(leftRightNode); @@ -102,6 +108,11 @@ export default class AvlTree extends BinarySearchTree { const rightLeftNode = rightNode.left; rightNode.setLeft(null); + if (rightLeftNode.right) { + rightNode.setLeft(rightLeftNode.right); + rightLeftNode.setRight(null); + } + // Attach rightLeftNode to the rootNode. rootNode.setRight(rightLeftNode); diff --git a/src/data-structures/tree/avl-tree/README.md b/src/data-structures/tree/avl-tree/README.md index 903da100..452a9eb4 100644 --- a/src/data-structures/tree/avl-tree/README.md +++ b/src/data-structures/tree/avl-tree/README.md @@ -45,3 +45,4 @@ AVL tree with balance factors (green) * [Tutorials Point](https://www.tutorialspoint.com/data_structures_algorithms/avl_tree_algorithm.htm) * [BTech](http://btechsmartclass.com/DS/U5_T2.html) * [AVL Tree Insertion on YouTube](https://www.youtube.com/watch?v=rbg7Qf8GkQ4&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8&index=12&) +* [AVL Tree Operations Visualisations](https://www.cs.usfca.edu/~galles/visualization/AVLtree.html) diff --git a/src/data-structures/tree/avl-tree/__test__/AvlTRee.test.js b/src/data-structures/tree/avl-tree/__test__/AvlTRee.test.js index f41c1831..5be7d119 100644 --- a/src/data-structures/tree/avl-tree/__test__/AvlTRee.test.js +++ b/src/data-structures/tree/avl-tree/__test__/AvlTRee.test.js @@ -185,4 +185,48 @@ describe('AvlTree', () => { expect(tree.root.height).toBe(2); expect(tree.toString()).toBe('6,8,9,18,21,22,43'); }); + + it('should do left right rotation and keeping left right node safe', () => { + const tree = new AvlTree(); + + tree.insert(30); + tree.insert(15); + tree.insert(40); + tree.insert(10); + tree.insert(18); + tree.insert(35); + tree.insert(45); + tree.insert(5); + tree.insert(12); + + expect(tree.toString()).toBe('5,10,12,15,18,30,35,40,45'); + expect(tree.root.height).toBe(3); + + tree.insert(11); + + expect(tree.toString()).toBe('5,10,11,12,15,18,30,35,40,45'); + expect(tree.root.height).toBe(3); + }); + + it('should do left right rotation and keeping left right node safe', () => { + const tree = new AvlTree(); + + tree.insert(30); + tree.insert(15); + tree.insert(40); + tree.insert(10); + tree.insert(18); + tree.insert(35); + tree.insert(45); + tree.insert(42); + tree.insert(47); + + expect(tree.toString()).toBe('10,15,18,30,35,40,42,45,47'); + expect(tree.root.height).toBe(3); + + tree.insert(43); + + expect(tree.toString()).toBe('10,15,18,30,35,40,42,43,45,47'); + expect(tree.root.height).toBe(3); + }); });