Skip to content

Commit 160fdef

Browse files
committed
Using standard maintain, and the delete operation have problems.
1 parent 61807b0 commit 160fdef

File tree

2 files changed

+35
-9
lines changed

2 files changed

+35
-9
lines changed

src/data-structures/size-balanced-tree.js

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -143,20 +143,46 @@
143143
return childNode;
144144
}
145145

146+
function maintain(node, leftChild) {
147+
if (node === Nil) {
148+
return node;
149+
}
150+
var savedNode = node;
151+
if (leftChild) {
152+
if (node.left.left.size > node.right.size) {
153+
node = RightRotate(node, node.left);
154+
} else if (node.left.right.size > node.right.size) {
155+
LeftRotate(node.left, node.left.right);
156+
node = RightRotate(node, node.left);
157+
}
158+
} else {
159+
if (node.right.right.size > node.left.size) {
160+
node = LeftRotate(node, node.right);
161+
} else if (node.right.left.size > node.left.size) {
162+
RightRotate(node.right, node.right.left);
163+
node = LeftRotate(node, node.right);
164+
}
165+
}
166+
node.updateSize();
167+
if (node === savedNode) {
168+
return node;
169+
}
170+
maintain(node.left, false);
171+
maintain(node.right, true);
172+
node = maintain(node, true);
173+
node = maintain(node, false);
174+
return node;
175+
}
176+
146177
function maintainSizeBalancedTree(node) {
147178
while (node.parent !== Nil) {
148179
let childNode = node;
149180
node = node.parent;
150-
if (node.right === childNode) {
151-
if (childNode.right.size > node.left.size) {
152-
node = LeftRotate(node, childNode);
153-
}
181+
if (node.left == childNode) {
182+
node = maintain(node, true);
154183
} else {
155-
if (childNode.left.size > node.right.size) {
156-
node = RightRotate(node, childNode);
157-
}
184+
node = maintain(node, false);
158185
}
159-
node.updateSize();
160186
}
161187
return node;
162188
}

test/data-structures/size-balanced-tree.spec.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ describe('SBTree', function () {
143143
expect(node.value).toBe(expectedArray[i]);
144144
}
145145
console.log(maxHeight);
146-
for (var i = 0; i < 50000; ++i) {
146+
for (var i = 0; i < 90000; ++i) {
147147
var removedPos = getRandomInt(0, sTree.size);
148148
sTree.remove(removedPos);
149149
expectedArray.splice(removedPos, 1);

0 commit comments

Comments
 (0)