525 lines
16 KiB
JavaScript
525 lines
16 KiB
JavaScript
var __extends = this && this.t || function() {
|
|
var extendStatics = function(e, i) {
|
|
extendStatics = Object.setPrototypeOf || {
|
|
__proto__: []
|
|
} instanceof Array && function(e, i) {
|
|
e.__proto__ = i;
|
|
} || function(e, i) {
|
|
for (var r in i) if (Object.prototype.hasOwnProperty.call(i, r)) e[r] = i[r];
|
|
};
|
|
return extendStatics(e, i);
|
|
};
|
|
return function(e, i) {
|
|
if (typeof i !== "function" && i !== null) throw new TypeError("Class extends value " + String(i) + " is not a constructor or null");
|
|
extendStatics(e, i);
|
|
function __() {
|
|
this.constructor = e;
|
|
}
|
|
e.prototype = i === null ? Object.create(i) : (__.prototype = i.prototype, new __);
|
|
};
|
|
}();
|
|
|
|
var __read = this && this._ || function(e, i) {
|
|
var r = typeof Symbol === "function" && e[Symbol.iterator];
|
|
if (!r) return e;
|
|
var t = r.call(e), n, s = [], f;
|
|
try {
|
|
while ((i === void 0 || i-- > 0) && !(n = t.next()).done) s.push(n.value);
|
|
} catch (e) {
|
|
f = {
|
|
error: e
|
|
};
|
|
} finally {
|
|
try {
|
|
if (n && !n.done && (r = t["return"])) r.call(t);
|
|
} finally {
|
|
if (f) throw f.error;
|
|
}
|
|
}
|
|
return s;
|
|
};
|
|
|
|
import { Container } from "../../ContainerBase";
|
|
|
|
import { TreeNode, TreeNodeEnableIndex } from "./TreeNode";
|
|
|
|
var TreeContainer = function(e) {
|
|
__extends(TreeContainer, e);
|
|
function TreeContainer(i, r) {
|
|
if (i === void 0) {
|
|
i = function(e, i) {
|
|
if (e < i) return -1;
|
|
if (e > i) return 1;
|
|
return 0;
|
|
};
|
|
}
|
|
if (r === void 0) {
|
|
r = false;
|
|
}
|
|
var t = e.call(this) || this;
|
|
t.rr = undefined;
|
|
t.ie = function(e, i) {
|
|
if (e === undefined) return false;
|
|
var r = t.ie(e.Y, i);
|
|
if (r) return true;
|
|
if (i(e)) return true;
|
|
return t.ie(e.Z, i);
|
|
};
|
|
t.A = i;
|
|
if (r) {
|
|
t.re = TreeNodeEnableIndex;
|
|
t.ir = function(e, i, r) {
|
|
var t = this.te(e, i, r);
|
|
if (t) {
|
|
var n = t.tt;
|
|
while (n !== this.J) {
|
|
n.rt += 1;
|
|
n = n.tt;
|
|
}
|
|
var s = this.ne(t);
|
|
if (s) {
|
|
var f = s, h = f.parentNode, u = f.grandParent, a = f.curNode;
|
|
h.recount();
|
|
u.recount();
|
|
a.recount();
|
|
}
|
|
}
|
|
};
|
|
t.se = function(e) {
|
|
var i = this.fe(e);
|
|
while (i !== this.J) {
|
|
i.rt -= 1;
|
|
i = i.tt;
|
|
}
|
|
};
|
|
} else {
|
|
t.re = TreeNode;
|
|
t.ir = function(e, i, r) {
|
|
var t = this.te(e, i, r);
|
|
if (t) this.ne(t);
|
|
};
|
|
t.se = t.fe;
|
|
}
|
|
t.J = new t.re;
|
|
return t;
|
|
}
|
|
TreeContainer.prototype.$ = function(e, i) {
|
|
var r;
|
|
while (e) {
|
|
var t = this.A(e.W, i);
|
|
if (t < 0) {
|
|
e = e.Z;
|
|
} else if (t > 0) {
|
|
r = e;
|
|
e = e.Y;
|
|
} else return e;
|
|
}
|
|
return r === undefined ? this.J : r;
|
|
};
|
|
TreeContainer.prototype.er = function(e, i) {
|
|
var r;
|
|
while (e) {
|
|
var t = this.A(e.W, i);
|
|
if (t <= 0) {
|
|
e = e.Z;
|
|
} else {
|
|
r = e;
|
|
e = e.Y;
|
|
}
|
|
}
|
|
return r === undefined ? this.J : r;
|
|
};
|
|
TreeContainer.prototype.tr = function(e, i) {
|
|
var r;
|
|
while (e) {
|
|
var t = this.A(e.W, i);
|
|
if (t < 0) {
|
|
r = e;
|
|
e = e.Z;
|
|
} else if (t > 0) {
|
|
e = e.Y;
|
|
} else return e;
|
|
}
|
|
return r === undefined ? this.J : r;
|
|
};
|
|
TreeContainer.prototype.nr = function(e, i) {
|
|
var r;
|
|
while (e) {
|
|
var t = this.A(e.W, i);
|
|
if (t < 0) {
|
|
r = e;
|
|
e = e.Z;
|
|
} else {
|
|
e = e.Y;
|
|
}
|
|
}
|
|
return r === undefined ? this.J : r;
|
|
};
|
|
TreeContainer.prototype.he = function(e) {
|
|
while (true) {
|
|
var i = e.tt;
|
|
if (i === this.J) return;
|
|
if (e.ee === 1) {
|
|
e.ee = 0;
|
|
return;
|
|
}
|
|
if (e === i.Y) {
|
|
var r = i.Z;
|
|
if (r.ee === 1) {
|
|
r.ee = 0;
|
|
i.ee = 1;
|
|
if (i === this.rr) {
|
|
this.rr = i.rotateLeft();
|
|
} else i.rotateLeft();
|
|
} else {
|
|
if (r.Z && r.Z.ee === 1) {
|
|
r.ee = i.ee;
|
|
i.ee = 0;
|
|
r.Z.ee = 0;
|
|
if (i === this.rr) {
|
|
this.rr = i.rotateLeft();
|
|
} else i.rotateLeft();
|
|
return;
|
|
} else if (r.Y && r.Y.ee === 1) {
|
|
r.ee = 1;
|
|
r.Y.ee = 0;
|
|
r.rotateRight();
|
|
} else {
|
|
r.ee = 1;
|
|
e = i;
|
|
}
|
|
}
|
|
} else {
|
|
var r = i.Y;
|
|
if (r.ee === 1) {
|
|
r.ee = 0;
|
|
i.ee = 1;
|
|
if (i === this.rr) {
|
|
this.rr = i.rotateRight();
|
|
} else i.rotateRight();
|
|
} else {
|
|
if (r.Y && r.Y.ee === 1) {
|
|
r.ee = i.ee;
|
|
i.ee = 0;
|
|
r.Y.ee = 0;
|
|
if (i === this.rr) {
|
|
this.rr = i.rotateRight();
|
|
} else i.rotateRight();
|
|
return;
|
|
} else if (r.Z && r.Z.ee === 1) {
|
|
r.ee = 1;
|
|
r.Z.ee = 0;
|
|
r.rotateLeft();
|
|
} else {
|
|
r.ee = 1;
|
|
e = i;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
TreeContainer.prototype.fe = function(e) {
|
|
var i, r;
|
|
if (this.o === 1) {
|
|
this.clear();
|
|
return this.J;
|
|
}
|
|
var t = e;
|
|
while (t.Y || t.Z) {
|
|
if (t.Z) {
|
|
t = t.Z;
|
|
while (t.Y) t = t.Y;
|
|
} else {
|
|
t = t.Y;
|
|
}
|
|
i = __read([ t.W, e.W ], 2), e.W = i[0], t.W = i[1];
|
|
r = __read([ t.L, e.L ], 2), e.L = r[0], t.L = r[1];
|
|
e = t;
|
|
}
|
|
if (this.J.Y === t) {
|
|
this.J.Y = t.tt;
|
|
} else if (this.J.Z === t) {
|
|
this.J.Z = t.tt;
|
|
}
|
|
this.he(t);
|
|
var n = t.tt;
|
|
if (t === n.Y) {
|
|
n.Y = undefined;
|
|
} else n.Z = undefined;
|
|
this.o -= 1;
|
|
this.rr.ee = 0;
|
|
return n;
|
|
};
|
|
TreeContainer.prototype.ne = function(e) {
|
|
while (true) {
|
|
var i = e.tt;
|
|
if (i.ee === 0) return;
|
|
var r = i.tt;
|
|
if (i === r.Y) {
|
|
var t = r.Z;
|
|
if (t && t.ee === 1) {
|
|
t.ee = i.ee = 0;
|
|
if (r === this.rr) return;
|
|
r.ee = 1;
|
|
e = r;
|
|
continue;
|
|
} else if (e === i.Z) {
|
|
e.ee = 0;
|
|
if (e.Y) e.Y.tt = i;
|
|
if (e.Z) e.Z.tt = r;
|
|
i.Z = e.Y;
|
|
r.Y = e.Z;
|
|
e.Y = i;
|
|
e.Z = r;
|
|
if (r === this.rr) {
|
|
this.rr = e;
|
|
this.J.tt = e;
|
|
} else {
|
|
var n = r.tt;
|
|
if (n.Y === r) {
|
|
n.Y = e;
|
|
} else n.Z = e;
|
|
}
|
|
e.tt = r.tt;
|
|
i.tt = e;
|
|
r.tt = e;
|
|
r.ee = 1;
|
|
return {
|
|
parentNode: i,
|
|
grandParent: r,
|
|
curNode: e
|
|
};
|
|
} else {
|
|
i.ee = 0;
|
|
if (r === this.rr) {
|
|
this.rr = r.rotateRight();
|
|
} else r.rotateRight();
|
|
r.ee = 1;
|
|
}
|
|
} else {
|
|
var t = r.Y;
|
|
if (t && t.ee === 1) {
|
|
t.ee = i.ee = 0;
|
|
if (r === this.rr) return;
|
|
r.ee = 1;
|
|
e = r;
|
|
continue;
|
|
} else if (e === i.Y) {
|
|
e.ee = 0;
|
|
if (e.Y) e.Y.tt = r;
|
|
if (e.Z) e.Z.tt = i;
|
|
r.Z = e.Y;
|
|
i.Y = e.Z;
|
|
e.Y = r;
|
|
e.Z = i;
|
|
if (r === this.rr) {
|
|
this.rr = e;
|
|
this.J.tt = e;
|
|
} else {
|
|
var n = r.tt;
|
|
if (n.Y === r) {
|
|
n.Y = e;
|
|
} else n.Z = e;
|
|
}
|
|
e.tt = r.tt;
|
|
i.tt = e;
|
|
r.tt = e;
|
|
r.ee = 1;
|
|
return {
|
|
parentNode: i,
|
|
grandParent: r,
|
|
curNode: e
|
|
};
|
|
} else {
|
|
i.ee = 0;
|
|
if (r === this.rr) {
|
|
this.rr = r.rotateLeft();
|
|
} else r.rotateLeft();
|
|
r.ee = 1;
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
};
|
|
TreeContainer.prototype.te = function(e, i, r) {
|
|
if (this.rr === undefined) {
|
|
this.o += 1;
|
|
this.rr = new this.re(e, i);
|
|
this.rr.ee = 0;
|
|
this.rr.tt = this.J;
|
|
this.J.tt = this.rr;
|
|
this.J.Y = this.rr;
|
|
this.J.Z = this.rr;
|
|
return;
|
|
}
|
|
var t;
|
|
var n = this.J.Y;
|
|
var s = this.A(n.W, e);
|
|
if (s === 0) {
|
|
n.L = i;
|
|
return;
|
|
} else if (s > 0) {
|
|
n.Y = new this.re(e, i);
|
|
n.Y.tt = n;
|
|
t = n.Y;
|
|
this.J.Y = t;
|
|
} else {
|
|
var f = this.J.Z;
|
|
var h = this.A(f.W, e);
|
|
if (h === 0) {
|
|
f.L = i;
|
|
return;
|
|
} else if (h < 0) {
|
|
f.Z = new this.re(e, i);
|
|
f.Z.tt = f;
|
|
t = f.Z;
|
|
this.J.Z = t;
|
|
} else {
|
|
if (r !== undefined) {
|
|
var u = r.D;
|
|
if (u !== this.J) {
|
|
var a = this.A(u.W, e);
|
|
if (a === 0) {
|
|
u.L = i;
|
|
return;
|
|
} else if (a > 0) {
|
|
var o = u.pre();
|
|
var l = this.A(o.W, e);
|
|
if (l === 0) {
|
|
o.L = i;
|
|
return;
|
|
} else if (l < 0) {
|
|
t = new this.re(e, i);
|
|
if (o.Z === undefined) {
|
|
o.Z = t;
|
|
t.tt = o;
|
|
} else {
|
|
u.Y = t;
|
|
t.tt = u;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (t === undefined) {
|
|
t = this.rr;
|
|
while (true) {
|
|
var d = this.A(t.W, e);
|
|
if (d > 0) {
|
|
if (t.Y === undefined) {
|
|
t.Y = new this.re(e, i);
|
|
t.Y.tt = t;
|
|
t = t.Y;
|
|
break;
|
|
}
|
|
t = t.Y;
|
|
} else if (d < 0) {
|
|
if (t.Z === undefined) {
|
|
t.Z = new this.re(e, i);
|
|
t.Z.tt = t;
|
|
t = t.Z;
|
|
break;
|
|
}
|
|
t = t.Z;
|
|
} else {
|
|
t.L = i;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
this.o += 1;
|
|
return t;
|
|
};
|
|
TreeContainer.prototype.clear = function() {
|
|
this.o = 0;
|
|
this.rr = undefined;
|
|
this.J.tt = undefined;
|
|
this.J.Y = this.J.Z = undefined;
|
|
};
|
|
TreeContainer.prototype.updateKeyByIterator = function(e, i) {
|
|
var r = e.D;
|
|
if (r === this.J) {
|
|
throw new TypeError("Invalid iterator!");
|
|
}
|
|
if (this.o === 1) {
|
|
r.W = i;
|
|
return true;
|
|
}
|
|
if (r === this.J.Y) {
|
|
if (this.A(r.next().W, i) > 0) {
|
|
r.W = i;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
if (r === this.J.Z) {
|
|
if (this.A(r.pre().W, i) < 0) {
|
|
r.W = i;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
var t = r.pre().W;
|
|
if (this.A(t, i) >= 0) return false;
|
|
var n = r.next().W;
|
|
if (this.A(n, i) <= 0) return false;
|
|
r.W = i;
|
|
return true;
|
|
};
|
|
TreeContainer.prototype.eraseElementByPos = function(e) {
|
|
var i = this;
|
|
if (e < 0 || e > this.o - 1) {
|
|
throw new RangeError;
|
|
}
|
|
var r = 0;
|
|
this.ie(this.rr, (function(t) {
|
|
if (e === r) {
|
|
i.se(t);
|
|
return true;
|
|
}
|
|
r += 1;
|
|
return false;
|
|
}));
|
|
};
|
|
TreeContainer.prototype.ar = function(e, i) {
|
|
while (e) {
|
|
var r = this.A(e.W, i);
|
|
if (r < 0) {
|
|
e = e.Z;
|
|
} else if (r > 0) {
|
|
e = e.Y;
|
|
} else return e;
|
|
}
|
|
return e;
|
|
};
|
|
TreeContainer.prototype.eraseElementByKey = function(e) {
|
|
if (!this.o) return;
|
|
var i = this.ar(this.rr, e);
|
|
if (i === undefined) return;
|
|
this.se(i);
|
|
};
|
|
TreeContainer.prototype.eraseElementByIterator = function(e) {
|
|
var i = e.D;
|
|
if (i === this.J) {
|
|
throw new RangeError("Invalid iterator");
|
|
}
|
|
if (i.Z === undefined) {
|
|
e = e.next();
|
|
}
|
|
this.se(i);
|
|
return e;
|
|
};
|
|
TreeContainer.prototype.getHeight = function() {
|
|
if (!this.o) return 0;
|
|
var traversal = function(e) {
|
|
if (!e) return 0;
|
|
return Math.max(traversal(e.Y), traversal(e.Z)) + 1;
|
|
};
|
|
return traversal(this.rr);
|
|
};
|
|
return TreeContainer;
|
|
}(Container);
|
|
|
|
export default TreeContainer; |