|
1 | 1 | 'use strict'; |
2 | 2 |
|
| 3 | +const TREE_KEY = 0; |
| 4 | +const TREE_VALUE = 1; |
| 5 | +const TREE_PARENT = 2; |
| 6 | +const TREE_LEFT = 3; |
| 7 | +const TREE_RIGHT = 4; |
| 8 | + |
3 | 9 | const tree = ( |
4 | 10 | key = null, value = null, parent = null, left = null, right = null |
5 | 11 | ) => [ |
6 | 12 | key, value, parent, left, right |
7 | 13 | ]; |
8 | 14 |
|
9 | 15 | const data = (node, key, value) => { |
10 | | - if (!key) return node[0, 1]; |
11 | | - node[0] = key; |
12 | | - node[1] = value; |
| 16 | + if (!key) return node.slice(TREE_KEY, TREE_VALUE); |
| 17 | + node[TREE_KEY] = key; |
| 18 | + node[TREE_VALUE] = value; |
13 | 19 | }; |
14 | 20 |
|
15 | 21 | const parent = (node, parent) => { |
16 | | - if (!parent) return node[2]; |
17 | | - node[2] = parent; |
| 22 | + if (!parent) return node[TREE_PARENT]; |
| 23 | + node[TREE_PARENT] = parent; |
18 | 24 | }; |
19 | 25 |
|
20 | 26 | const left = (node, key, value) => { |
21 | | - if (!key) return node[3]; |
22 | | - node[3] = tree(key, value, node); |
| 27 | + if (!key) return node[TREE_LEFT]; |
| 28 | + node[TREE_LEFT] = tree(key, value, node); |
23 | 29 | }; |
24 | 30 |
|
25 | 31 | const right = (node, key, value) => { |
26 | | - if (!key) return node[4]; |
27 | | - node[4] = tree(key, value, node); |
| 32 | + if (!key) return node[TREE_RIGHT]; |
| 33 | + node[TREE_RIGHT] = tree(key, value, node); |
28 | 34 | }; |
29 | 35 |
|
30 | 36 | const insert = (root, key, value) => { |
31 | | - if (root[0] === null) return tree.data(root, key, value); |
32 | | - const i = key < root[0] ? 3 : 4; |
33 | | - if (root[i]) tree.insert(root[i], key, value); |
34 | | - else root[i] = tree(key, value, root); |
| 37 | + if (root[TREE_KEY] === null) return tree.data(root, key, value); |
| 38 | + const edge = key < root[TREE_KEY] ? TREE_LEFT : TREE_RIGHT; |
| 39 | + if (root[edge]) tree.insert(root[edge], key, value); |
| 40 | + else root[edge] = tree(key, value, root); |
35 | 41 | }; |
36 | 42 |
|
37 | 43 | const push = (root, node) => { |
38 | | - const i = node[0] < root[0] ? 3 : 4; |
| 44 | + const i = node[TREE_KEY] < root[TREE_KEY] ? TREE_LEFT : TREE_RIGHT; |
39 | 45 | if (root[i]) { |
40 | 46 | tree.push(root[i], node); |
41 | 47 | return; |
42 | 48 | } |
43 | 49 | root[i] = node; |
44 | | - node[2] = root; |
| 50 | + node[TREE_PARENT] = root; |
45 | 51 | }; |
46 | 52 |
|
47 | 53 | const search = (root, key) => { |
48 | | - const k = root[0]; |
| 54 | + const k = root[TREE_KEY]; |
49 | 55 | if (key === k) return root; |
50 | | - const next = root[key < k ? 3 : 4]; |
| 56 | + const next = root[key < k ? TREE_LEFT : TREE_RIGHT]; |
51 | 57 | if (next) { |
52 | | - if (key === next[0]) return next; |
| 58 | + if (key === next[TREE_KEY]) return next; |
53 | 59 | return tree.search(next, key); |
54 | 60 | } |
55 | 61 | }; |
56 | 62 |
|
57 | 63 | const get = (root, key) => { |
58 | 64 | const node = tree.search(root, key); |
59 | | - if (node) return node[1]; |
| 65 | + if (node) return node[TREE_VALUE]; |
60 | 66 | }; |
61 | 67 |
|
62 | 68 | const set = (root, key, value) => { |
63 | 69 | const node = tree.search(root, key); |
64 | | - if (node) node[1] = value; |
| 70 | + if (node) node[TREE_VALUE] = value; |
65 | 71 | else tree.insert(); |
66 | 72 | }; |
67 | 73 |
|
68 | 74 | const del = (root, key) => { |
69 | 75 | const node = tree.search(root, key); |
70 | 76 | if (node) { |
71 | 77 | const [, , parent, left, right] = node; |
72 | | - const i = parent[3] === node ? 3 : 4; |
| 78 | + const i = parent[TREE_LEFT] === node ? TREE_LEFT : TREE_RIGHT; |
73 | 79 | parent[i] = null; |
74 | 80 | if (left) tree.push(parent, left); |
75 | 81 | if (right) tree.push(parent, right); |
|
0 commit comments