From 60393e9404cf45009fc6533f896a32c23ac95316 Mon Sep 17 00:00:00 2001
From: sh <475784041@qq.com>
Date: Wed, 20 Mar 2019 21:16:17 +0800
Subject: [PATCH] Fix Bug in AVL Tree rorateLeftLeft and rotateRightRight

---
 src/data-structures/tree/avl-tree/AvlTree.js    | 12 ++++++++++--
 .../tree/avl-tree/__test__/AvlTRee.test.js      | 17 +++++++++++++++++
 2 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/src/data-structures/tree/avl-tree/AvlTree.js b/src/data-structures/tree/avl-tree/AvlTree.js
index 8a8b5d12cd..dee48b49e6 100644
--- a/src/data-structures/tree/avl-tree/AvlTree.js
+++ b/src/data-structures/tree/avl-tree/AvlTree.js
@@ -64,7 +64,11 @@ export default class AvlTree extends BinarySearchTree {
 
     // Make left node to be a child of rootNode's parent.
     if (rootNode.parent) {
-      rootNode.parent.setLeft(leftNode);
+      if (rootNode.parent.left === rootNode) {
+        rootNode.parent.setLeft(leftNode);
+      } else {
+        rootNode.parent.setRight(leftNode);
+      }
     } else if (rootNode === this.root) {
       // If root node is root then make left node to be a new root.
       this.root = leftNode;
@@ -145,7 +149,11 @@ export default class AvlTree extends BinarySearchTree {
 
     // Make right node to be a child of rootNode's parent.
     if (rootNode.parent) {
-      rootNode.parent.setRight(rightNode);
+      if (rootNode.parent.left === rootNode) {
+        rootNode.parent.setLeft(rightNode);
+      } else {
+        rootNode.parent.setRight(rightNode);
+      }
     } else if (rootNode === this.root) {
       // If root node is root then make right node to be a new root.
       this.root = rightNode;
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 cf64420091..7005558ff6 100644
--- a/src/data-structures/tree/avl-tree/__test__/AvlTRee.test.js
+++ b/src/data-structures/tree/avl-tree/__test__/AvlTRee.test.js
@@ -230,6 +230,23 @@ describe('AvlTree', () => {
     expect(tree.root.height).toBe(3);
   });
 
+  it('should do right right rotation and keeping left node safe', () => {
+    const tree = new AvlTree();
+    tree.insert(24);
+    tree.insert(12);
+    tree.insert(34);
+    tree.insert(15);
+
+    expect(tree.toString()).toBe('12,15,24,34');
+
+    tree.insert(18);
+    expect(tree.toString()).toBe('12,15,18,24,34');
+    expect(tree.root.height).toBe(2);
+    expect(tree.root.left.value).toBe(15);
+    expect(tree.root.left.left.value).toBe(12);
+    expect(tree.root.left.right.value).toBe(18);
+  });
+
   it('should remove values from the tree with right-right rotation', () => {
     const tree = new AvlTree();