Skip to main content
Using Deno in production at your company? Earn free Deno merch.
Give us feedback
Go to Latest
File
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554
// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.import { assertEquals, assertStrictEquals } from "../testing/asserts.ts";import { ascend, descend, RedBlackTree } from "./red_black_tree.ts";import { Container, MyMath } from "./_test_utils.ts";
Deno.test("[collections/RedBlackTree] with default ascend comparator", () => { const trees: RedBlackTree<number>[] = [ new RedBlackTree(), new RedBlackTree(), ]; const values: number[] = [-10, 9, -1, 100, 1, 0, -100, 10, -9];
const expectedMin: number[][] = [ [-10, -10, -10, -10, -10, -10, -100, -100, -100], [-9, -9, -100, -100, -100, -100, -100, -100, -100], ]; const expectedMax: number[][] = [ [-10, 9, 9, 100, 100, 100, 100, 100, 100], [-9, 10, 10, 10, 10, 100, 100, 100, 100], ]; for (let i = 0; i < 2; i++) { assertEquals(trees[i].size, 0); assertEquals(trees[i].isEmpty(), true); for (let j = 0; j < values.length; j++) { assertEquals(trees[i].find(values[j]), null); assertEquals(trees[i].insert(values[j]), true); assertEquals(trees[i].find(values[j]), values[j]); assertEquals(trees[i].size, j + 1); assertEquals(trees[i].isEmpty(), false); assertEquals(trees[i].min(), expectedMin[i][j]); assertEquals(trees[i].max(), expectedMax[i][j]); } for (let j = 0; j < values.length; j++) { assertEquals(trees[i].insert(values[j]), false); assertEquals(trees[i].size, values.length); assertEquals(trees[i].isEmpty(), false); assertEquals(trees[i].min(), -100); assertEquals(trees[i].max(), 100); } values.reverse(); }
for (let i = 0; i < 2; i++) { assertEquals( [...trees[i].lnrValues()], [-100, -10, -9, -1, 0, 1, 9, 10, 100], ); assertEquals(trees[i].size, values.length); assertEquals(trees[i].isEmpty(), false);
assertEquals( [...trees[i]], [-100, -10, -9, -1, 0, 1, 9, 10, 100], ); assertEquals(trees[i].size, values.length); assertEquals(trees[i].isEmpty(), false);
assertEquals( [...trees[i].rnlValues()], [100, 10, 9, 1, 0, -1, -9, -10, -100], ); assertEquals(trees[i].size, values.length); assertEquals(trees[i].isEmpty(), false); }
assertEquals( [...trees[0].nlrValues()], [-1, -10, -100, -9, 9, 1, 0, 100, 10], ); assertEquals( [...trees[1].nlrValues()], [-9, -100, -10, 1, 0, -1, 10, 9, 100], ); for (let i = 0; i < 2; i++) { assertEquals(trees[i].size, values.length); assertEquals(trees[i].isEmpty(), false); }
assertEquals( [...trees[0].lrnValues()], [-100, -9, -10, 0, 1, 10, 100, 9, -1], ); assertEquals( [...trees[1].lrnValues()], [-10, -100, -1, 0, 9, 100, 10, 1, -9], ); for (let i = 0; i < 2; i++) { assertEquals(trees[i].size, values.length); assertEquals(trees[i].isEmpty(), false); }
assertEquals( [...trees[0].lvlValues()], [-1, -10, 9, -100, -9, 1, 100, 0, 10], ); assertEquals( [...trees[1].lvlValues()], [-9, -100, 1, -10, 0, 10, -1, 9, 100], ); for (let i = 0; i < 2; i++) { assertEquals(trees[i].size, values.length); assertEquals(trees[i].isEmpty(), false); }
for (let i = 0; i < 2; i++) { const expected: number[] = [-100, -10, -9, -1, 0, 1, 9, 10, 100]; for (let j = 0; j < values.length; j++) { assertEquals(trees[i].size, values.length - j); assertEquals(trees[i].isEmpty(), false); assertEquals(trees[i].find(values[j]), values[j]);
assertEquals(trees[i].remove(values[j]), true); expected.splice(expected.indexOf(values[j]), 1); assertEquals([...trees[i]], expected); assertEquals(trees[i].find(values[j]), null);
assertEquals(trees[i].remove(values[j]), false); assertEquals([...trees[i]], expected); assertEquals(trees[i].find(values[j]), null); } assertEquals(trees[i].size, 0); assertEquals(trees[i].isEmpty(), true); }});
Deno.test("[collections/RedBlackTree] with descend comparator", () => { const trees: RedBlackTree<number>[] = [ new RedBlackTree(descend), new RedBlackTree(descend), ]; const values: number[] = [-10, 9, -1, 100, 1, 0, -100, 10, -9];
const expectedMin: number[][] = [ [-10, 9, 9, 100, 100, 100, 100, 100, 100], [-9, 10, 10, 10, 10, 100, 100, 100, 100, 100], ]; const expectedMax: number[][] = [ [-10, -10, -10, -10, -10, -10, -100, -100, -100], [-9, -9, -100, -100, -100, -100, -100, -100, -100], ]; for (let i = 0; i < 2; i++) { assertEquals(trees[i].size, 0); assertEquals(trees[i].isEmpty(), true); for (let j = 0; j < values.length; j++) { assertEquals(trees[i].find(values[j]), null); assertEquals(trees[i].insert(values[j]), true); assertEquals(trees[i].find(values[j]), values[j]); assertEquals(trees[i].size, j + 1); assertEquals(trees[i].isEmpty(), false); assertEquals(trees[i].min(), expectedMin[i][j]); assertEquals(trees[i].max(), expectedMax[i][j]); } for (let j = 0; j < values.length; j++) { assertEquals(trees[i].insert(values[j]), false); assertEquals(trees[i].size, values.length); assertEquals(trees[i].isEmpty(), false); assertEquals(trees[i].min(), 100); assertEquals(trees[i].max(), -100); } values.reverse(); }
for (let i = 0; i < 2; i++) { assertEquals( [...trees[i].lnrValues()], [100, 10, 9, 1, 0, -1, -9, -10, -100], ); assertEquals(trees[i].size, values.length); assertEquals(trees[i].isEmpty(), false);
assertEquals( [...trees[i]], [100, 10, 9, 1, 0, -1, -9, -10, -100], ); assertEquals(trees[i].size, values.length); assertEquals(trees[i].isEmpty(), false);
assertEquals( [...trees[i].rnlValues()], [-100, -10, -9, -1, 0, 1, 9, 10, 100], ); assertEquals(trees[i].size, values.length); assertEquals(trees[i].isEmpty(), false); }
assertEquals( [...trees[0].nlrValues()], [-1, 9, 100, 10, 1, 0, -10, -9, -100], ); assertEquals( [...trees[1].nlrValues()], [-9, 1, 10, 100, 9, 0, -1, -100, -10], ); for (let i = 0; i < 2; i++) { assertEquals(trees[i].size, values.length); assertEquals(trees[i].isEmpty(), false); }
assertEquals( [...trees[0].lrnValues()], [10, 100, 0, 1, 9, -9, -100, -10, -1], ); assertEquals( [...trees[1].lrnValues()], [100, 9, 10, -1, 0, 1, -10, -100, -9], ); for (let i = 0; i < 2; i++) { assertEquals(trees[i].size, values.length); assertEquals(trees[i].isEmpty(), false); }
assertEquals( [...trees[0].lvlValues()], [-1, 9, -10, 100, 1, -9, -100, 10, 0], ); assertEquals( [...trees[1].lvlValues()], [-9, 1, -100, 10, 0, -10, 100, 9, -1], ); for (let i = 0; i < 2; i++) { assertEquals(trees[i].size, values.length); assertEquals(trees[i].isEmpty(), false); }
for (let i = 0; i < 2; i++) { const expected: number[] = [100, 10, 9, 1, 0, -1, -9, -10, -100]; for (let j = 0; j < values.length; j++) { assertEquals(trees[i].size, values.length - j); assertEquals(trees[i].isEmpty(), false); assertEquals(trees[i].find(values[j]), values[j]);
assertEquals(trees[i].remove(values[j]), true); expected.splice(expected.indexOf(values[j]), 1); assertEquals([...trees[i]], expected); assertEquals(trees[i].find(values[j]), null);
assertEquals(trees[i].remove(values[j]), false); assertEquals([...trees[i]], expected); assertEquals(trees[i].find(values[j]), null); } assertEquals(trees[i].size, 0); assertEquals(trees[i].isEmpty(), true); }});
Deno.test("[collections/RedBlackTree] containing objects", () => { const tree: RedBlackTree<Container> = new RedBlackTree(( a: Container, b: Container, ) => ascend(a.id, b.id)); const ids: number[] = [-10, 9, -1, 100, 1, 0, -100, 10, -9];
for (let i = 0; i < ids.length; i++) { const newContainer: Container = { id: ids[i], values: [] }; assertEquals(tree.find(newContainer), null); assertEquals(tree.insert(newContainer), true); newContainer.values.push(i - 1, i, i + 1); assertStrictEquals(tree.find({ id: ids[i], values: [] }), newContainer); assertEquals(tree.size, i + 1); assertEquals(tree.isEmpty(), false); } for (let i = 0; i < ids.length; i++) { const newContainer: Container = { id: ids[i], values: [] }; assertEquals( tree.find({ id: ids[i] } as Container), { id: ids[i], values: [i - 1, i, i + 1] }, ); assertEquals(tree.insert(newContainer), false); assertEquals( tree.find({ id: ids[i], values: [] }), { id: ids[i], values: [i - 1, i, i + 1] }, ); assertEquals(tree.size, ids.length); assertEquals(tree.isEmpty(), false); }
assertEquals( [...tree].map((container) => container.id), [-100, -10, -9, -1, 0, 1, 9, 10, 100], ); assertEquals(tree.size, ids.length); assertEquals(tree.isEmpty(), false);
const expected: number[] = [-100, -10, -9, -1, 0, 1, 9, 10, 100]; for (let i = 0; i < ids.length; i++) { assertEquals(tree.size, ids.length - i); assertEquals(tree.isEmpty(), false); assertEquals( tree.find({ id: ids[i], values: [] }), { id: ids[i], values: [i - 1, i, i + 1] }, );
assertEquals(tree.remove({ id: ids[i], values: [] }), true); expected.splice(expected.indexOf(ids[i]), 1); assertEquals([...tree].map((container) => container.id), expected); assertEquals(tree.find({ id: ids[i], values: [] }), null);
assertEquals(tree.remove({ id: ids[i], values: [] }), false); assertEquals([...tree].map((container) => container.id), expected); assertEquals(tree.find({ id: ids[i], values: [] }), null); } assertEquals(tree.size, 0); assertEquals(tree.isEmpty(), true);});
Deno.test("[collections/RedBlackTree] from Iterable", () => { const values: number[] = [-10, 9, -1, 100, 9, 1, 0, 9, -100, 10, -9]; const originalValues: number[] = Array.from(values); const expected: number[] = [-100, -10, -9, -1, 0, 1, 9, 10, 100]; let tree: RedBlackTree<number> = RedBlackTree.from(values); assertEquals(values, originalValues); assertEquals([...tree], expected); assertEquals([...tree.nlrValues()], [-1, -10, -100, -9, 9, 1, 0, 100, 10]); assertEquals([...tree.lvlValues()], [-1, -10, 9, -100, -9, 1, 100, 0, 10]);
tree = RedBlackTree.from(values, { compare: descend }); assertEquals(values, originalValues); assertEquals([...tree].reverse(), expected); assertEquals([...tree.nlrValues()], [-1, 9, 100, 10, 1, 0, -10, -9, -100]); assertEquals([...tree.lvlValues()], [-1, 9, -10, 100, 1, -9, -100, 10, 0]);
tree = RedBlackTree.from(values, { map: (v: number) => 2 * v, }); assertEquals([...tree], expected.map((v: number) => 2 * v)); assertEquals([...tree.nlrValues()], [-2, -20, -200, -18, 18, 2, 0, 200, 20]); assertEquals([...tree.lvlValues()], [-2, -20, 18, -200, -18, 2, 200, 0, 20]);
const math = new MyMath(); tree = RedBlackTree.from(values, { map: function (this: MyMath, v: number) { return this.multiply(3, v); }, thisArg: math, }); assertEquals(values, originalValues); assertEquals([...tree], expected.map((v: number) => 3 * v)); assertEquals([...tree.nlrValues()], [-3, -30, -300, -27, 27, 3, 0, 300, 30]); assertEquals([...tree.lvlValues()], [-3, -30, 27, -300, -27, 3, 300, 0, 30]);
tree = RedBlackTree.from(values, { compare: descend, map: (v: number) => 2 * v, }); assertEquals(values, originalValues); assertEquals([...tree].reverse(), expected.map((v: number) => 2 * v)); assertEquals([...tree.nlrValues()], [-2, 18, 200, 20, 2, 0, -20, -18, -200]); assertEquals([...tree.lvlValues()], [-2, 18, -20, 200, 2, -18, -200, 20, 0]);
tree = RedBlackTree.from(values, { compare: descend, map: function (this: MyMath, v: number) { return this.multiply(3, v); }, thisArg: math, }); assertEquals(values, originalValues); assertEquals([...tree].reverse(), expected.map((v: number) => 3 * v)); assertEquals([...tree.nlrValues()], [-3, 27, 300, 30, 3, 0, -30, -27, -300]); assertEquals([...tree.lvlValues()], [-3, 27, -30, 300, 3, -27, -300, 30, 0]);});
Deno.test("[collections/RedBlackTree] from RedBlackTree with default ascend comparator", () => { const values: number[] = [-10, 9, -1, 100, 9, 1, 0, 9, -100, 10, -9]; const expected: number[] = [-100, -10, -9, -1, 0, 1, 9, 10, 100]; const originalTree: RedBlackTree<number> = new RedBlackTree(); for (const value of values) originalTree.insert(value); let tree: RedBlackTree<number> = RedBlackTree.from(originalTree); assertEquals([...originalTree], expected); assertEquals([...tree], expected); assertEquals([...tree.nlrValues()], [...originalTree.nlrValues()]); assertEquals([...tree.lvlValues()], [...originalTree.lvlValues()]);
tree = RedBlackTree.from(originalTree, { compare: descend }); assertEquals([...originalTree], expected); assertEquals([...tree].reverse(), expected); assertEquals([...tree.nlrValues()], [-1, 1, 10, 100, 9, 0, -10, -9, -100]); assertEquals([...tree.lvlValues()], [-1, 1, -10, 10, 0, -9, -100, 100, 9]);
tree = RedBlackTree.from(originalTree, { map: (v: number) => 2 * v, }); assertEquals([...originalTree], expected); assertEquals([...tree], expected.map((v: number) => 2 * v)); assertEquals([...tree.nlrValues()], [-2, -20, -200, -18, 2, 0, 20, 18, 200]); assertEquals([...tree.lvlValues()], [-2, -20, 2, -200, -18, 0, 20, 18, 200]);
const math = new MyMath(); tree = RedBlackTree.from(originalTree, { map: function (this: MyMath, v: number) { return this.multiply(3, v); }, thisArg: math, }); assertEquals([...originalTree], expected); assertEquals([...tree], expected.map((v: number) => 3 * v)); assertEquals([...tree.nlrValues()], [-3, -30, -300, -27, 3, 0, 30, 27, 300]); assertEquals([...tree.lvlValues()], [-3, -30, 3, -300, -27, 0, 30, 27, 300]);
tree = RedBlackTree.from(originalTree, { compare: descend, map: (v: number) => 2 * v, }); assertEquals([...originalTree], expected); assertEquals([...tree].reverse(), expected.map((v: number) => 2 * v)); assertEquals([...tree.nlrValues()], [-2, 2, 20, 200, 18, 0, -20, -18, -200]); assertEquals([...tree.lvlValues()], [-2, 2, -20, 20, 0, -18, -200, 200, 18]);
tree = RedBlackTree.from(originalTree, { compare: descend, map: function (this: MyMath, v: number) { return this.multiply(3, v); }, thisArg: math, }); assertEquals([...originalTree], expected); assertEquals([...tree].reverse(), expected.map((v: number) => 3 * v)); assertEquals([...tree.nlrValues()], [-3, 3, 30, 300, 27, 0, -30, -27, -300]); assertEquals([...tree.lvlValues()], [-3, 3, -30, 30, 0, -27, -300, 300, 27]);});
Deno.test("[collections/RedBlackTree] from RedBlackTree with descend comparator", () => { const values: number[] = [-10, 9, -1, 100, 9, 1, 0, 9, -100, 10, -9]; const expected: number[] = [100, 10, 9, 1, 0, -1, -9, -10, -100]; const originalTree: RedBlackTree<number> = new RedBlackTree(descend); for (const value of values) originalTree.insert(value); let tree: RedBlackTree<number> = RedBlackTree.from(originalTree); assertEquals([...originalTree], expected); assertEquals([...tree], expected); assertEquals([...tree.nlrValues()], [...originalTree.nlrValues()]); assertEquals([...tree.lvlValues()], [...originalTree.lvlValues()]);
tree = RedBlackTree.from(originalTree, { compare: ascend }); assertEquals([...originalTree], expected); assertEquals([...tree].reverse(), expected); assertEquals([...tree.nlrValues()], [1, -1, -10, -100, -9, 0, 10, 9, 100]); assertEquals([...tree.lvlValues()], [1, -1, 10, -10, 0, 9, 100, -100, -9]);
tree = RedBlackTree.from(originalTree, { map: (v: number) => 2 * v, }); assertEquals([...originalTree], expected); assertEquals([...tree], expected.map((v: number) => 2 * v)); assertEquals([...tree.nlrValues()], [2, 20, 200, 18, -2, 0, -20, -18, -200]); assertEquals([...tree.lvlValues()], [2, 20, -2, 200, 18, 0, -20, -18, -200]);
const math = new MyMath(); tree = RedBlackTree.from(originalTree, { map: function (this: MyMath, v: number) { return this.multiply(3, v); }, thisArg: math, }); assertEquals([...originalTree], expected); assertEquals([...tree], expected.map((v: number) => 3 * v)); assertEquals([...tree.nlrValues()], [3, 30, 300, 27, -3, 0, -30, -27, -300]); assertEquals([...tree.lvlValues()], [3, 30, -3, 300, 27, 0, -30, -27, -300]);
tree = RedBlackTree.from(originalTree, { compare: ascend, map: (v: number) => 2 * v, }); assertEquals([...originalTree], expected); assertEquals([...tree].reverse(), expected.map((v: number) => 2 * v)); assertEquals([...tree.nlrValues()], [2, -2, -20, -200, -18, 0, 20, 18, 200]); assertEquals([...tree.lvlValues()], [2, -2, 20, -20, 0, 18, 200, -200, -18]);
tree = RedBlackTree.from(originalTree, { compare: ascend, map: function (this: MyMath, v: number) { return this.multiply(3, v); }, thisArg: math, }); assertEquals([...originalTree], expected); assertEquals([...tree].reverse(), expected.map((v: number) => 3 * v)); assertEquals([...tree.nlrValues()], [3, -3, -30, -300, -27, 0, 30, 27, 300]); assertEquals([...tree.lvlValues()], [3, -3, 30, -30, 0, 27, 300, -300, -27]);});
Deno.test("[collections/RedBlackTree] insert rebalance left", () => { let values: number[] = [8, 4, 10, 0, 6, 11, -2, 2]; let tree: RedBlackTree<number> = RedBlackTree.from(values); assertEquals([...tree.nlrValues()], [8, 4, 0, -2, 2, 6, 10, 11]); assertEquals([...tree.lvlValues()], [8, 4, 10, 0, 6, 11, -2, 2]); assertEquals(tree.insert(-3), true); assertEquals([...tree.nlrValues()], [4, 0, -2, -3, 2, 8, 6, 10, 11]); assertEquals([...tree.lvlValues()], [4, 0, 8, -2, 2, 6, 10, -3, 11]);
tree = RedBlackTree.from(values); assertEquals(tree.insert(-1), true); assertEquals([...tree.nlrValues()], [4, 0, -2, -1, 2, 8, 6, 10, 11]); assertEquals([...tree.lvlValues()], [4, 0, 8, -2, 2, 6, 10, -1, 11]);
tree = RedBlackTree.from(values); assertEquals(tree.insert(1), true); assertEquals([...tree.nlrValues()], [4, 0, -2, 2, 1, 8, 6, 10, 11]); assertEquals([...tree.lvlValues()], [4, 0, 8, -2, 2, 6, 10, 1, 11]);
tree = RedBlackTree.from(values); assertEquals(tree.insert(3), true); assertEquals([...tree.nlrValues()], [4, 0, -2, 2, 3, 8, 6, 10, 11]); assertEquals([...tree.lvlValues()], [4, 0, 8, -2, 2, 6, 10, 3, 11]);
values = [4, -4, 6, -5, 0, 7, -2, 2]; tree = RedBlackTree.from(values); assertEquals([...tree.nlrValues()], [4, -4, -5, 0, -2, 2, 6, 7]); assertEquals([...tree.lvlValues()], [4, -4, 6, -5, 0, 7, -2, 2]); assertEquals(tree.insert(-3), true); assertEquals([...tree.nlrValues()], [0, -4, -5, -2, -3, 4, 2, 6, 7]); assertEquals([...tree.lvlValues()], [0, -4, 4, -5, -2, 2, 6, -3, 7]);
tree = RedBlackTree.from(values); assertEquals(tree.insert(-1), true); assertEquals([...tree.nlrValues()], [0, -4, -5, -2, -1, 4, 2, 6, 7]); assertEquals([...tree.lvlValues()], [0, -4, 4, -5, -2, 2, 6, -1, 7]);
tree = RedBlackTree.from(values); assertEquals(tree.insert(1), true); assertEquals([...tree.nlrValues()], [0, -4, -5, -2, 4, 2, 1, 6, 7]); assertEquals([...tree.lvlValues()], [0, -4, 4, -5, -2, 2, 6, 1, 7]);
tree = RedBlackTree.from(values); assertEquals(tree.insert(3), true); assertEquals([...tree.nlrValues()], [0, -4, -5, -2, 4, 2, 3, 6, 7]); assertEquals([...tree.lvlValues()], [0, -4, 4, -5, -2, 2, 6, 3, 7]);});
Deno.test("[collections/RedBlackTree] insert rebalance right", () => { let values: number[] = [-4, -6, 4, 0, 6, -7, -2, 2]; let tree: RedBlackTree<number> = RedBlackTree.from(values); assertEquals([...tree.nlrValues()], [-4, -6, -7, 4, 0, -2, 2, 6]); assertEquals([...tree.lvlValues()], [-4, -6, 4, -7, 0, 6, -2, 2]); assertEquals(tree.insert(-3), true); assertEquals([...tree.nlrValues()], [0, -4, -6, -7, -2, -3, 4, 2, 6]); assertEquals([...tree.lvlValues()], [0, -4, 4, -6, -2, 2, 6, -7, -3]);
tree = RedBlackTree.from(values); assertEquals(tree.insert(-1), true); assertEquals([...tree.nlrValues()], [0, -4, -6, -7, -2, -1, 4, 2, 6]); assertEquals([...tree.lvlValues()], [0, -4, 4, -6, -2, 2, 6, -7, -1]);
tree = RedBlackTree.from(values); assertEquals(tree.insert(1), true); assertEquals([...tree.nlrValues()], [0, -4, -6, -7, -2, 4, 2, 1, 6]); assertEquals([...tree.lvlValues()], [0, -4, 4, -6, -2, 2, 6, -7, 1]);
tree = RedBlackTree.from(values); assertEquals(tree.insert(3), true); assertEquals([...tree.nlrValues()], [0, -4, -6, -7, -2, 4, 2, 3, 6]); assertEquals([...tree.lvlValues()], [0, -4, 4, -6, -2, 2, 6, -7, 3]);
values = [-8, -10, -4, -11, -6, 0, -2, 2]; tree = RedBlackTree.from(values); assertEquals([...tree.nlrValues()], [-8, -10, -11, -4, -6, 0, -2, 2]); assertEquals([...tree.lvlValues()], [-8, -10, -4, -11, -6, 0, -2, 2]); assertEquals(tree.insert(-3), true); assertEquals([...tree.nlrValues()], [-4, -8, -10, -11, -6, 0, -2, -3, 2]); assertEquals([...tree.lvlValues()], [-4, -8, 0, -10, -6, -2, 2, -11, -3]);
tree = RedBlackTree.from(values); assertEquals(tree.insert(-1), true); assertEquals([...tree.nlrValues()], [-4, -8, -10, -11, -6, 0, -2, -1, 2]); assertEquals([...tree.lvlValues()], [-4, -8, 0, -10, -6, -2, 2, -11, -1]);
tree = RedBlackTree.from(values); assertEquals(tree.insert(1), true); assertEquals([...tree.nlrValues()], [-4, -8, -10, -11, -6, 0, -2, 2, 1]); assertEquals([...tree.lvlValues()], [-4, -8, 0, -10, -6, -2, 2, -11, 1]);
tree = RedBlackTree.from(values); assertEquals(tree.insert(3), true); assertEquals([...tree.nlrValues()], [-4, -8, -10, -11, -6, 0, -2, 2, 3]); assertEquals([...tree.lvlValues()], [-4, -8, 0, -10, -6, -2, 2, -11, 3]);});
Deno.test("[collections/RedBlackTree] remove rebalance root", () => { let values: number[] = [0]; let tree: RedBlackTree<number> = RedBlackTree.from(values); assertEquals([...tree.nlrValues()], [0]); assertEquals(tree.remove(0), true); assertEquals([...tree.nlrValues()], []);
values = [0, -1, 1]; tree = RedBlackTree.from(values); assertEquals([...tree.nlrValues()], [0, -1, 1]); assertEquals([...tree.lvlValues()], [0, -1, 1]); assertEquals(tree.remove(0), true); assertEquals([...tree.nlrValues()], [1, -1]); assertEquals([...tree.lvlValues()], [1, -1]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(-1), true); assertEquals([...tree.nlrValues()], [0, 1]); assertEquals([...tree.lvlValues()], [0, 1]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(1), true); assertEquals([...tree.nlrValues()], [0, -1]); assertEquals([...tree.lvlValues()], [0, -1]);
values = [0, -2, 2, -3, -1, 1, 3]; tree = RedBlackTree.from(values); assertEquals([...tree.nlrValues()], [0, -2, -3, -1, 2, 1, 3]); assertEquals([...tree.lvlValues()], [0, -2, 2, -3, -1, 1, 3]); assertEquals(tree.remove(0), true); assertEquals([...tree.nlrValues()], [1, -2, -3, -1, 2, 3]); assertEquals([...tree.lvlValues()], [1, -2, 2, -3, -1, 3]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(-2), true); assertEquals([...tree.nlrValues()], [0, -1, -3, 2, 1, 3]); assertEquals([...tree.lvlValues()], [0, -1, 2, -3, 1, 3]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(2), true); assertEquals([...tree.nlrValues()], [0, -2, -3, -1, 3, 1]); assertEquals([...tree.lvlValues()], [0, -2, 3, -3, -1, 1]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(-3), true); assertEquals([...tree.nlrValues()], [0, -2, -1, 2, 1, 3]); assertEquals([...tree.lvlValues()], [0, -2, 2, -1, 1, 3]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(-1), true); assertEquals([...tree.nlrValues()], [0, -2, -3, 2, 1, 3]); assertEquals([...tree.lvlValues()], [0, -2, 2, -3, 1, 3]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(1), true); assertEquals([...tree.nlrValues()], [0, -2, -3, -1, 2, 3]); assertEquals([...tree.lvlValues()], [0, -2, 2, -3, -1, 3]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(3), true); assertEquals([...tree.nlrValues()], [0, -2, -3, -1, 2, 1]); assertEquals([...tree.lvlValues()], [0, -2, 2, -3, -1, 1]);
values = [0, -2, 2, -3, -1]; tree = RedBlackTree.from(values); assertEquals([...tree.nlrValues()], [0, -2, -3, -1, 2]); assertEquals([...tree.lvlValues()], [0, -2, 2, -3, -1]); assertEquals(tree.remove(0), true); assertEquals([...tree.nlrValues()], [-2, -3, 2, -1]); assertEquals([...tree.lvlValues()], [-2, -3, 2, -1]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(-2), true); assertEquals([...tree.nlrValues()], [0, -1, -3, 2]); assertEquals([...tree.lvlValues()], [0, -1, 2, -3]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(2), true); assertEquals([...tree.nlrValues()], [-2, -3, 0, -1]); assertEquals([...tree.lvlValues()], [-2, -3, 0, -1]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(-3), true); assertEquals([...tree.nlrValues()], [0, -2, -1, 2]); assertEquals([...tree.lvlValues()], [0, -2, 2, -1]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(-1), true); assertEquals([...tree.nlrValues()], [0, -2, -3, 2]); assertEquals([...tree.lvlValues()], [0, -2, 2, -3]);
values = [0, -2, 2, 1, 3]; tree = RedBlackTree.from(values); assertEquals([...tree.nlrValues()], [0, -2, 2, 1, 3]); assertEquals([...tree.lvlValues()], [0, -2, 2, 1, 3]); assertEquals(tree.remove(0), true); assertEquals([...tree.nlrValues()], [1, -2, 2, 3]); assertEquals([...tree.lvlValues()], [1, -2, 2, 3]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(-2), true); assertEquals([...tree.nlrValues()], [2, 0, 1, 3]); assertEquals([...tree.lvlValues()], [2, 0, 3, 1]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(2), true); assertEquals([...tree.nlrValues()], [0, -2, 3, 1]); assertEquals([...tree.lvlValues()], [0, -2, 3, 1]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(1), true); assertEquals([...tree.nlrValues()], [0, -2, 2, 3]); assertEquals([...tree.lvlValues()], [0, -2, 2, 3]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(3), true); assertEquals([...tree.nlrValues()], [0, -2, 2, 1]); assertEquals([...tree.lvlValues()], [0, -2, 2, 1]);
values = [0, -2, 2, -3]; tree = RedBlackTree.from(values); assertEquals([...tree.nlrValues()], [0, -2, -3, 2]); assertEquals([...tree.lvlValues()], [0, -2, 2, -3]); assertEquals(tree.remove(-3), true); assertEquals([...tree.nlrValues()], [0, -2, 2]); assertEquals([...tree.lvlValues()], [0, -2, 2]); assertEquals(tree.remove(0), true); assertEquals([...tree.nlrValues()], [2, -2]); assertEquals([...tree.lvlValues()], [2, -2]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(-3), true); assertEquals(tree.remove(-2), true); assertEquals([...tree.nlrValues()], [0, 2]); assertEquals([...tree.lvlValues()], [0, 2]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(-3), true); assertEquals(tree.remove(2), true); assertEquals([...tree.nlrValues()], [0, -2]); assertEquals([...tree.lvlValues()], [0, -2]);
values = [0, -2, 2, 3]; tree = RedBlackTree.from(values); assertEquals([...tree.nlrValues()], [0, -2, 2, 3]); assertEquals([...tree.lvlValues()], [0, -2, 2, 3]); assertEquals(tree.remove(3), true); assertEquals([...tree.nlrValues()], [0, -2, 2]); assertEquals([...tree.lvlValues()], [0, -2, 2]); assertEquals(tree.remove(0), true); assertEquals([...tree.nlrValues()], [2, -2]); assertEquals([...tree.lvlValues()], [2, -2]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(3), true); assertEquals(tree.remove(-2), true); assertEquals([...tree.nlrValues()], [0, 2]); assertEquals([...tree.lvlValues()], [0, 2]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(3), true); assertEquals(tree.remove(2), true); assertEquals([...tree.nlrValues()], [0, -2]); assertEquals([...tree.lvlValues()], [0, -2]);
values = [0, -2, 2, -3]; tree = RedBlackTree.from(values); assertEquals([...tree.nlrValues()], [0, -2, -3, 2]); assertEquals([...tree.lvlValues()], [0, -2, 2, -3]); assertEquals(tree.remove(0), true); assertEquals([...tree.nlrValues()], [-2, -3, 2]); assertEquals([...tree.lvlValues()], [-2, -3, 2]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(-2), true); assertEquals([...tree.nlrValues()], [0, -3, 2]); assertEquals([...tree.lvlValues()], [0, -3, 2]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(2), true); assertEquals([...tree.nlrValues()], [-2, -3, 0]); assertEquals([...tree.lvlValues()], [-2, -3, 0]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(-3), true); assertEquals([...tree.nlrValues()], [0, -2, 2]); assertEquals([...tree.lvlValues()], [0, -2, 2]);
values = [0, -2, 2, -1]; tree = RedBlackTree.from(values); assertEquals([...tree.nlrValues()], [0, -2, -1, 2]); assertEquals([...tree.lvlValues()], [0, -2, 2, -1]); assertEquals(tree.remove(0), true); assertEquals([...tree.nlrValues()], [-1, -2, 2]); assertEquals([...tree.lvlValues()], [-1, -2, 2]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(-2), true); assertEquals([...tree.nlrValues()], [0, -1, 2]); assertEquals([...tree.lvlValues()], [0, -1, 2]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(2), true); assertEquals([...tree.nlrValues()], [-1, -2, 0]); assertEquals([...tree.lvlValues()], [-1, -2, 0]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(-1), true); assertEquals([...tree.nlrValues()], [0, -2, 2]); assertEquals([...tree.lvlValues()], [0, -2, 2]);
values = [0, -2, 2, 1]; tree = RedBlackTree.from(values); assertEquals([...tree.nlrValues()], [0, -2, 2, 1]); assertEquals([...tree.lvlValues()], [0, -2, 2, 1]); assertEquals(tree.remove(0), true); assertEquals([...tree.nlrValues()], [1, -2, 2]); assertEquals([...tree.lvlValues()], [1, -2, 2]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(-2), true); assertEquals([...tree.nlrValues()], [1, 0, 2]); assertEquals([...tree.lvlValues()], [1, 0, 2]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(2), true); assertEquals([...tree.nlrValues()], [0, -2, 1]); assertEquals([...tree.lvlValues()], [0, -2, 1]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(1), true); assertEquals([...tree.nlrValues()], [0, -2, 2]); assertEquals([...tree.lvlValues()], [0, -2, 2]);
values = [0, -2, 2, 3]; tree = RedBlackTree.from(values); assertEquals([...tree.nlrValues()], [0, -2, 2, 3]); assertEquals([...tree.lvlValues()], [0, -2, 2, 3]); assertEquals(tree.remove(0), true); assertEquals([...tree.nlrValues()], [2, -2, 3]); assertEquals([...tree.lvlValues()], [2, -2, 3]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(-2), true); assertEquals([...tree.nlrValues()], [2, 0, 3]); assertEquals([...tree.lvlValues()], [2, 0, 3]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(2), true); assertEquals([...tree.nlrValues()], [0, -2, 3]); assertEquals([...tree.lvlValues()], [0, -2, 3]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(3), true); assertEquals([...tree.nlrValues()], [0, -2, 2]); assertEquals([...tree.lvlValues()], [0, -2, 2]);});
Deno.test("[collections/RedBlackTree] remove rebalance left", () => { let values = [4, 5, 0]; let tree = RedBlackTree.from(values); assertEquals([...tree.nlrValues()], [4, 0, 5]); assertEquals(tree.remove(0), true); assertEquals([...tree.nlrValues()], [4, 5]);
values = [4, 5, 0, -1, 1]; tree = RedBlackTree.from(values); assertEquals([...tree.nlrValues()], [4, 0, -1, 1, 5]); assertEquals([...tree.lvlValues()], [4, 0, 5, -1, 1]); assertEquals(tree.remove(0), true); assertEquals([...tree.nlrValues()], [4, 1, -1, 5]); assertEquals([...tree.lvlValues()], [4, 1, 5, -1]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(-1), true); assertEquals([...tree.nlrValues()], [4, 0, 1, 5]); assertEquals([...tree.lvlValues()], [4, 0, 5, 1]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(1), true); assertEquals([...tree.nlrValues()], [4, 0, -1, 5]); assertEquals([...tree.lvlValues()], [4, 0, 5, -1]);
values = [4, 5, 0, -2, 2, -3, -1]; tree = RedBlackTree.from(values); assertEquals([...tree.nlrValues()], [4, 0, -2, -3, -1, 2, 5]); assertEquals([...tree.lvlValues()], [4, 0, 5, -2, 2, -3, -1]); assertEquals(tree.remove(0), true); assertEquals([...tree.nlrValues()], [4, -2, -3, 2, -1, 5]); assertEquals([...tree.lvlValues()], [4, -2, 5, -3, 2, -1]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(-2), true); assertEquals([...tree.nlrValues()], [4, 0, -1, -3, 2, 5]); assertEquals([...tree.lvlValues()], [4, 0, 5, -1, 2, -3]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(2), true); assertEquals([...tree.nlrValues()], [4, -2, -3, 0, -1, 5]); assertEquals([...tree.lvlValues()], [4, -2, 5, -3, 0, -1]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(-3), true); assertEquals([...tree.nlrValues()], [4, 0, -2, -1, 2, 5]); assertEquals([...tree.lvlValues()], [4, 0, 5, -2, 2, -1]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(-1), true); assertEquals([...tree.nlrValues()], [4, 0, -2, -3, 2, 5]); assertEquals([...tree.lvlValues()], [4, 0, 5, -2, 2, -3]);
values = [4, 5, 0, -2, 2, 1, 3]; tree = RedBlackTree.from(values); assertEquals([...tree.nlrValues()], [4, 0, -2, 2, 1, 3, 5]); assertEquals([...tree.lvlValues()], [4, 0, 5, -2, 2, 1, 3]); assertEquals(tree.remove(0), true); assertEquals([...tree.nlrValues()], [4, 1, -2, 2, 3, 5]); assertEquals([...tree.lvlValues()], [4, 1, 5, -2, 2, 3]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(-2), true); assertEquals([...tree.nlrValues()], [4, 2, 0, 1, 3, 5]); assertEquals([...tree.lvlValues()], [4, 2, 5, 0, 3, 1]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(2), true); assertEquals([...tree.nlrValues()], [4, 0, -2, 3, 1, 5]); assertEquals([...tree.lvlValues()], [4, 0, 5, -2, 3, 1]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(1), true); assertEquals([...tree.nlrValues()], [4, 0, -2, 2, 3, 5]); assertEquals([...tree.lvlValues()], [4, 0, 5, -2, 2, 3]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(3), true); assertEquals([...tree.nlrValues()], [4, 0, -2, 2, 1, 5]); assertEquals([...tree.lvlValues()], [4, 0, 5, -2, 2, 1]);
values = [4, 5, 0, -2, 2, -3]; tree = RedBlackTree.from(values); assertEquals([...tree.nlrValues()], [4, 0, -2, -3, 2, 5]); assertEquals([...tree.lvlValues()], [4, 0, 5, -2, 2, -3]); assertEquals(tree.remove(-3), true); assertEquals([...tree.nlrValues()], [4, 0, -2, 2, 5]); assertEquals([...tree.lvlValues()], [4, 0, 5, -2, 2]); assertEquals(tree.remove(0), true); assertEquals([...tree.nlrValues()], [4, 2, -2, 5]); assertEquals([...tree.lvlValues()], [4, 2, 5, -2]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(-3), true); assertEquals(tree.remove(-2), true); assertEquals([...tree.nlrValues()], [4, 0, 2, 5]); assertEquals([...tree.lvlValues()], [4, 0, 5, 2]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(-3), true); assertEquals(tree.remove(2), true); assertEquals([...tree.nlrValues()], [4, 0, -2, 5]); assertEquals([...tree.lvlValues()], [4, 0, 5, -2]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(-3), true); assertEquals(tree.remove(4), true); assertEquals([...tree.nlrValues()], [0, -2, 5, 2]); assertEquals([...tree.lvlValues()], [0, -2, 5, 2]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(-3), true); assertEquals(tree.remove(5), true); assertEquals([...tree.nlrValues()], [0, -2, 4, 2]); assertEquals([...tree.lvlValues()], [0, -2, 4, 2]);
values = [4, 5, 0, -2, 2, 3]; tree = RedBlackTree.from(values); assertEquals([...tree.nlrValues()], [4, 0, -2, 2, 3, 5]); assertEquals([...tree.lvlValues()], [4, 0, 5, -2, 2, 3]); assertEquals(tree.remove(3), true); assertEquals([...tree.nlrValues()], [4, 0, -2, 2, 5]); assertEquals([...tree.lvlValues()], [4, 0, 5, -2, 2]); assertEquals(tree.remove(0), true); assertEquals([...tree.nlrValues()], [4, 2, -2, 5]); assertEquals([...tree.lvlValues()], [4, 2, 5, -2]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(3), true); assertEquals(tree.remove(-2), true); assertEquals([...tree.nlrValues()], [4, 0, 2, 5]); assertEquals([...tree.lvlValues()], [4, 0, 5, 2]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(3), true); assertEquals(tree.remove(2), true); assertEquals([...tree.nlrValues()], [4, 0, -2, 5]); assertEquals([...tree.lvlValues()], [4, 0, 5, -2]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(3), true); assertEquals(tree.remove(4), true); assertEquals([...tree.nlrValues()], [0, -2, 5, 2]); assertEquals([...tree.lvlValues()], [0, -2, 5, 2]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(3), true); assertEquals(tree.remove(5), true); assertEquals([...tree.nlrValues()], [0, -2, 4, 2]); assertEquals([...tree.lvlValues()], [0, -2, 4, 2]);
values = [4, 5, 0, -2, 2, -3, -1, 1, 3]; tree = RedBlackTree.from(values); assertEquals([...tree.nlrValues()], [4, 0, -2, -3, -1, 2, 1, 3, 5]); assertEquals([...tree.lvlValues()], [4, 0, 5, -2, 2, -3, -1, 1, 3]); assertEquals(tree.remove(0), true); assertEquals([...tree.nlrValues()], [4, 1, -2, -3, -1, 2, 3, 5]); assertEquals([...tree.lvlValues()], [4, 1, 5, -2, 2, -3, -1, 3]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(-2), true); assertEquals([...tree.nlrValues()], [4, 0, -1, -3, 2, 1, 3, 5]); assertEquals([...tree.lvlValues()], [4, 0, 5, -1, 2, -3, 1, 3]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(2), true); assertEquals([...tree.nlrValues()], [4, 0, -2, -3, -1, 3, 1, 5]); assertEquals([...tree.lvlValues()], [4, 0, 5, -2, 3, -3, -1, 1]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(-3), true); assertEquals([...tree.nlrValues()], [4, 0, -2, -1, 2, 1, 3, 5]); assertEquals([...tree.lvlValues()], [4, 0, 5, -2, 2, -1, 1, 3]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(-1), true); assertEquals([...tree.nlrValues()], [4, 0, -2, -3, 2, 1, 3, 5]); assertEquals([...tree.lvlValues()], [4, 0, 5, -2, 2, -3, 1, 3]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(1), true); assertEquals([...tree.nlrValues()], [4, 0, -2, -3, -1, 2, 3, 5]); assertEquals([...tree.lvlValues()], [4, 0, 5, -2, 2, -3, -1, 3]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(3), true); assertEquals([...tree.nlrValues()], [4, 0, -2, -3, -1, 2, 1, 5]); assertEquals([...tree.lvlValues()], [4, 0, 5, -2, 2, -3, -1, 1]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(4), true); assertEquals([...tree.nlrValues()], [0, -2, -3, -1, 2, 1, 5, 3]); assertEquals([...tree.lvlValues()], [0, -2, 2, -3, -1, 1, 5, 3]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(5), true); assertEquals([...tree.nlrValues()], [0, -2, -3, -1, 2, 1, 4, 3]); assertEquals([...tree.lvlValues()], [0, -2, 2, -3, -1, 1, 4, 3]);
values = [4, 5, 0, -2, 2, -3]; tree = RedBlackTree.from(values); assertEquals([...tree.nlrValues()], [4, 0, -2, -3, 2, 5]); assertEquals([...tree.lvlValues()], [4, 0, 5, -2, 2, -3]); assertEquals(tree.remove(0), true); assertEquals([...tree.nlrValues()], [4, -2, -3, 2, 5]); assertEquals([...tree.lvlValues()], [4, -2, 5, -3, 2]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(-2), true); assertEquals([...tree.nlrValues()], [4, 0, -3, 2, 5]); assertEquals([...tree.lvlValues()], [4, 0, 5, -3, 2]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(2), true); assertEquals([...tree.nlrValues()], [4, -2, -3, 0, 5]); assertEquals([...tree.lvlValues()], [4, -2, 5, -3, 0]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(-3), true); assertEquals([...tree.nlrValues()], [4, 0, -2, 2, 5]); assertEquals([...tree.lvlValues()], [4, 0, 5, -2, 2]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(4), true); assertEquals([...tree.nlrValues()], [0, -2, -3, 5, 2]); assertEquals([...tree.lvlValues()], [0, -2, 5, -3, 2]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(5), true); assertEquals([...tree.nlrValues()], [0, -2, -3, 4, 2]); assertEquals([...tree.lvlValues()], [0, -2, 4, -3, 2]);
values = [4, 5, 0, -2, 2, -1]; tree = RedBlackTree.from(values); assertEquals([...tree.nlrValues()], [4, 0, -2, -1, 2, 5]); assertEquals([...tree.lvlValues()], [4, 0, 5, -2, 2, -1]); assertEquals(tree.remove(0), true); assertEquals([...tree.nlrValues()], [4, -1, -2, 2, 5]); assertEquals([...tree.lvlValues()], [4, -1, 5, -2, 2]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(-2), true); assertEquals([...tree.nlrValues()], [4, 0, -1, 2, 5]); assertEquals([...tree.lvlValues()], [4, 0, 5, -1, 2]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(2), true); assertEquals([...tree.nlrValues()], [4, -1, -2, 0, 5]); assertEquals([...tree.lvlValues()], [4, -1, 5, -2, 0]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(-1), true); assertEquals([...tree.nlrValues()], [4, 0, -2, 2, 5]); assertEquals([...tree.lvlValues()], [4, 0, 5, -2, 2]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(4), true); assertEquals([...tree.nlrValues()], [0, -2, -1, 5, 2]); assertEquals([...tree.lvlValues()], [0, -2, 5, -1, 2]);
tree = RedBlackTree.from(values); assertEquals(tree.remove(5), true); assertEquals([...tree.nlrValues()], [0, -2, -1, 4, 2]); assertEquals([...tree.lvlValues()], [0, -2, 4, -1, 2]);
values = [4, 5, 0, -2, 2, 1]; tree = RedBlackTree.from(values); assertEquals([...tree.nlrValues()], [4, 0, -2, 2, 1, 5]); assertEquals([...tree.lvlValues()], [4, 0, 5, -2, 2, 1]); assertEquals(tree.remove(0)