diff --git a/avl.js b/avl.js index eb78565..31f67da 100644 --- a/avl.js +++ b/avl.js @@ -153,12 +153,10 @@ class AVLTree extends RankedTree { this.record("Updating rank of nodes affected by rotations", n); }); - return factor == 0; + return factor != 0; } - deleteFixup(y, parent) { - let x = y ? y : parent; - + deleteFixup(x, parent) { let factor = balanceFactor(x); switch (factor) { case 0: @@ -168,10 +166,10 @@ class AVLTree extends RankedTree { x ); - return false; + return true; case -1: case 1: - return true; + return false; } let rotatingAroundRoot = x.parent == null; @@ -201,8 +199,15 @@ class AVLTree extends RankedTree { } deleteRebalance(node, parent) { - while (node || parent) { - this.deleteFixup(node, parent); + if (!node && !parent) { + return; + } + + if (!node) { + [node, parent] = [parent, parent.parent]; + } + + while (node && this.deleteFixup(node, parent)) { [node, parent] = [parent, parent ? parent.parent : null]; } }