Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 98e2c03

Browse files
fix(avl-tree): balance was not working properly
Fixes: amejiarosario#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

Lines changed: 7 additions & 9 deletions
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

Lines changed: 61 additions & 0 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /