Skip to content

Commit 98e2c03

Browse files
committed
fix(avl-tree): balance was not working properly
Fixes: #33
1 parent 48fe6f3 commit 98e2c03

File tree

2 files changed

+68
-9
lines changed

2 files changed

+68
-9
lines changed

src/data-structures/trees/avl-tree.js

+7-9
Original file line numberDiff line numberDiff line change
@@ -17,23 +17,21 @@ const {
1717
* - LR rotations: double rotation left-right
1818
* - RL rotations: double rotation right-left
1919
*
20-
* @param {TreeNode} node
20+
* @param {BinaryTreeNode} node
2121
*/
2222
function balance(node) {
2323
if (node.balanceFactor > 1) {
2424
// left subtree is higher than right subtree
25-
if (node.left.balanceFactor > 0) {
26-
return rightRotation(node);
27-
} if (node.left.balanceFactor < 0) {
25+
if (node.left.balanceFactor < 0) {
2826
return leftRightRotation(node);
2927
}
30-
} else if (node.balanceFactor < -1) {
28+
return rightRotation(node);
29+
} if (node.balanceFactor < -1) {
3130
// right subtree is higher than left subtree
32-
if (node.right.balanceFactor < 0) {
33-
return leftRotation(node);
34-
} if (node.right.balanceFactor > 0) {
31+
if (node.right.balanceFactor > 0) {
3532
return rightLeftRotation(node);
3633
}
34+
return leftRotation(node);
3735
}
3836
return node;
3937
}
@@ -43,7 +41,7 @@ function balance(node) {
4341
/**
4442
* Bubbles up balancing nodes a their parents
4543
*
46-
* @param {TreeNode} node
44+
* @param {BinaryTreeNode} node
4745
*/
4846
function balanceUpstream(node) {
4947
let current = node;

src/data-structures/trees/avl-tree.spec.js

+61
Original file line numberDiff line numberDiff line change
@@ -165,4 +165,65 @@ describe('AvlTree', () => {
165165
null, null, null, null, null, null]);
166166
});
167167
});
168+
169+
describe('balancing to the left', () => {
170+
let n32;
171+
beforeEach(() => {
172+
n32 = tree.add(32);
173+
tree.add(8);
174+
tree.add(64);
175+
tree.add(4);
176+
tree.add(16);
177+
tree.add(48);
178+
tree.add(128);
179+
tree.add(2);
180+
tree.add(6);
181+
tree.add(10);
182+
tree.add(20);
183+
});
184+
185+
it('should have all nodes', () => {
186+
expect(tree.toArray()).toEqual([32, 8, 64, 4, 16, 48, 128, 2, 6, 10, 20,
187+
null, null, null, null, null, null, null, null, null, null, null, null]);
188+
});
189+
190+
it('should rebalance when removing', () => {
191+
tree.remove(64);
192+
expect(tree.toArray()).toEqual([32, 8, 128, 4, 16, 48, null, 2, 6, 10, 20,
193+
null, null, null, null, null, null, null, null, null, null]);
194+
expect(n32.balanceFactor).toBe(1);
195+
expect(n32.right.balanceFactor).toBe(1);
196+
expect(n32.left.balanceFactor).toBe(0);
197+
198+
tree.remove(48);
199+
expect(tree.toArray()).toEqual([8, 4, 32, 2, 6, 16, 128, null, null, null, null, 10, 20,
200+
null, null, null, null, null, null]);
201+
});
202+
});
203+
204+
describe('balancing to the right', () => {
205+
beforeEach(() => {
206+
tree.add(8);
207+
tree.add(4);
208+
tree.add(32);
209+
tree.add(2);
210+
tree.add(16);
211+
tree.add(64);
212+
tree.add(10);
213+
tree.add(20);
214+
tree.add(60);
215+
tree.add(70);
216+
});
217+
218+
it('should build the tree', () => {
219+
expect(tree.toArray()).toEqual([8, 4, 32, 2, null, 16, 64, null, null, 10, 20, 60, 70,
220+
null, null, null, null, null, null, null, null]);
221+
});
222+
223+
it('should rebalance right side', () => {
224+
tree.remove(2);
225+
expect(tree.toArray()).toEqual([32, 8, 64, 4, 16, 60, 70, null, null, 10, 20,
226+
null, null, null, null, null, null, null, null]);
227+
});
228+
});
168229
});

0 commit comments

Comments
 (0)