int d = right[b];
int c = left[d];
if (d == 0) throw new Error("rotation error");
- if(DEBUG) check();
left[d] = b;
right[b] = c;
else if (right[p] == b) right[p] = d;
else throw new Error("rotate called with invalid parent");
size[b] = 1 + sizeof(left[b]) + sizeof(right[b]);
- size[d] = 1 + sizeof(left[d]) + sizeof(right[d]);
-
- if(DEBUG) try { check(); } catch(Error e) { System.err.println("rotate: " + toTheLeft + "," + b + "," + p); throw e; }
+ size[d] = 1 + sizeof(left[d]) + sizeof(right[d]);
}
private void balance(int slot, int p) {
right[arg] = 0;
parent[arg] = p;
left[p] = arg;
- if(DEBUG) check();
balance(arg, p);
// we take the place of a preexisting node
if(left[arg] != 0) parent[left[arg]] = arg;
if (slot == root) {
root = arg;
- if(DEBUG) check();
balance(slot, arg);
balance(arg, 0);
} else {
if (left[p] == slot) left[p] = arg;
else if (right[p] == slot) right[p] = arg;
else throw new Error("should never happen");
- if(DEBUG) check();
balance(slot, arg);
balance(arg, p);
}
if(parent[root] != 0) throw new Error("parent of the root isn't 0");
if(left[0] != 0 || right[0] != 0 || size[0] != 0 || parent[0] != 0)
throw new Error("someone messed with [0]");
+
+ int c = 0;
+ int n = leftmost(root);
+ while(n != 0) { c++; n = next(n); }
+ if(c != size[root]) throw new Error("size[] mismatch");
+
if(root != 0) check(root);
} catch(Error e) {
printTree();