|
10 | 10 |
|
11 | 11 | ### Solution
|
12 | 12 |
|
13 |
| -```js |
| 13 | +```ts |
| 14 | +interface MyNode { |
| 15 | + value: number; |
| 16 | + left?: MyNode; |
| 17 | + right?: MyNode; |
| 18 | +} |
| 19 | + |
14 | 20 | // Tree representation
|
15 |
| -const value13 = { value: 13, left: undefined, right: undefined}; |
16 |
| -const value14 = { value: 14, left: value13, right: undefined}; |
17 |
| -const value7 = { value: 7, left: undefined, right: undefined}; |
18 |
| -const value4 = { value: 4, left: undefined, right: undefined}; |
19 |
| -const value6 = { value: 6, left: value4, right: value7}; |
20 |
| -const value1 = { value: 1, left: undefined, right: undefined}; |
21 |
| -const value3 = { value: 3, left: value1, right: value6 }; |
22 |
| -const value10 = { value: 10, left: undefined, right: value14 }; |
23 |
| -const root = { value: 8, left: value3, right: value10 }; |
| 21 | +const value13: MyNode = { value: 13, left: undefined, right: undefined }; |
| 22 | +const value14: MyNode = { value: 14, left: value13, right: undefined }; |
| 23 | +const value7: MyNode = { value: 7, left: undefined, right: undefined }; |
| 24 | +const value4: MyNode = { value: 4, left: undefined, right: undefined }; |
| 25 | +const value6: MyNode = { value: 6, left: value4, right: value7 }; |
| 26 | +const value1: MyNode = { value: 1, left: undefined, right: undefined }; |
| 27 | +const value3: MyNode = { value: 3, left: value1, right: value6 }; |
| 28 | +const value10: MyNode = { value: 10, left: undefined, right: value14 }; |
| 29 | +const root: MyNode = { value: 8, left: value3, right: value10 }; |
24 | 30 |
|
25 | 31 | /**
|
26 |
| -* Find the path from root to a value |
27 |
| -* |
28 |
| -* @param {object} root - The root of the tree |
29 |
| -* @param {number} value - The value to search for |
30 |
| -*/ |
31 |
| -const findPath = function(root, value){ |
32 |
| - if(!root || !root.value) return []; |
| 32 | + * Find the path from root to a value |
| 33 | + * |
| 34 | + * @param {MyNode} root |
| 35 | + * @param {number} value |
| 36 | + * @returns {Array<MyNode>} |
| 37 | + */ |
| 38 | +const findPath = function(root: MyNode, value: number): Array<MyNode> { |
| 39 | + if (!root || !root.value) return []; |
33 | 40 | this.path = this.path || {};
|
34 | 41 | this.path[`${value}`] = this.path[`${value}`] || [];
|
35 | 42 | this.path[`${value}`].push(root.value);
|
36 | 43 |
|
37 |
| - if(root.value === value) { |
| 44 | + if (root.value === value) { |
38 | 45 | return this.path[`${value}`];
|
39 | 46 | } else {
|
40 |
| - if(value > root.value) findPath(root.right, value); |
| 47 | + if (value > root.value) findPath(root.right, value); |
41 | 48 | else if (value < root.value) findPath(root.left, value);
|
42 | 49 | }
|
43 | 50 |
|
44 | 51 | return this.path[`${value}`];
|
45 |
| -} |
| 52 | +}; |
46 | 53 |
|
47 | 54 | /**
|
48 | 55 | * Find a value in the tree
|
49 | 56 | *
|
50 |
| -* @param {object} root - The root of the tree |
| 57 | +* @param {MyNode} root - The root of the tree |
51 | 58 | * @param {number} value - The value to search for
|
| 59 | +* @returns {MyNode} |
52 | 60 | */
|
53 |
| -const find = function(root, value){ |
54 |
| - if(!root || !root.value) return undefined; |
| 61 | +const find = function(root: MyNode, value: number): MyNode { |
| 62 | + if (!root || !root.value) return undefined; |
55 | 63 |
|
56 |
| - if(root.value === value) { |
| 64 | + if (root.value === value) { |
57 | 65 | return root;
|
58 | 66 | } else {
|
59 |
| - if(value > root.value) return find(root.right, value); |
| 67 | + if (value > root.value) return find(root.right, value); |
60 | 68 | else if (value < root.value) return find(root.left, value);
|
61 | 69 | }
|
62 | 70 |
|
63 | 71 | return root;
|
64 |
| -} |
| 72 | +}; |
65 | 73 |
|
66 | 74 | /**
|
67 | 75 | * Insert a value in the tree
|
68 | 76 | *
|
69 |
| -* @param {object} root - The root of the tree |
| 77 | +* @param {MyNode} root - The root of the tree |
70 | 78 | * @param {number} value - The value to insert
|
| 79 | +* @returns {MyNode} |
71 | 80 | */
|
72 |
| -const insert = function(root, value){ |
73 |
| - if (value > root.value){ |
74 |
| - if(root.right === undefined){ |
| 81 | +const insert = function(root: MyNode, value: number): MyNode { |
| 82 | + if (value > root.value) { |
| 83 | + if (root.right === undefined) { |
75 | 84 | root.right = { value: value, left: undefined, right: undefined };
|
76 | 85 | } else {
|
77 | 86 | insert(root.right, value);
|
78 | 87 | }
|
79 |
| - } else if(value < root.value){ |
80 |
| - if(root.left === undefined){ |
| 88 | + } else if (value < root.value) { |
| 89 | + if (root.left === undefined) { |
81 | 90 | root.left = { value: value, left: undefined, right: undefined };
|
82 | 91 | } else {
|
83 | 92 | insert(root.left, value);
|
84 | 93 | }
|
85 | 94 | }
|
86 | 95 | return root;
|
87 |
| -} |
| 96 | +}; |
88 | 97 |
|
89 | 98 | /**
|
90 | 99 | * Traverse the tree and process it through a callback
|
91 | 100 | *
|
92 |
| -* @param {object} root - The root of the tree |
| 101 | +* @param {MyNode} root - The root of the tree |
93 | 102 | * @param {function} cb
|
94 | 103 | */
|
95 |
| -const traverse = function(root, cb){ |
96 |
| - if(root && root.value){ |
| 104 | +const traverse = function(root: MyNode, cb: Function) { |
| 105 | + if (root && root.value) { |
97 | 106 | cb(root.value);
|
98 | 107 | traverse(root.right, cb);
|
99 | 108 | traverse(root.left, cb);
|
100 | 109 | }
|
101 |
| -} |
| 110 | +}; |
102 | 111 |
|
103 | 112 | /**
|
104 | 113 | * Find the minimum value in the tree
|
105 | 114 | *
|
106 |
| -* @param {object} root - The root of the tree |
| 115 | +* @param {MyNode} root - The root of the tree |
| 116 | +* @returns {number} |
107 | 117 | */
|
108 |
| -const findMin = function(root){ |
109 |
| - if(root.left) return findMin(root.left) |
| 118 | +const findMin = function(root: MyNode): number { |
| 119 | + if (root.left) return findMin(root.left); |
110 | 120 | else return root.value;
|
111 |
| -} |
| 121 | +}; |
112 | 122 |
|
113 | 123 | /**
|
114 | 124 | * Find the maximum value in the tree
|
115 | 125 | *
|
116 |
| -* @param {object} root - The root of the tree |
| 126 | +* @param {MyNode} root - The root of the tree |
| 127 | +* @returns {number} |
117 | 128 | */
|
118 |
| -const findMax = function(root){ |
119 |
| - if(root.right) return findMax(root.right) |
| 129 | +const findMax = function(root: MyNode): number { |
| 130 | + if (root.right) return findMax(root.right); |
120 | 131 | else return root.value;
|
121 |
| -} |
| 132 | +}; |
122 | 133 |
|
123 | 134 | /**
|
124 | 135 | * Find the parent of a value in the tree
|
125 | 136 | *
|
126 |
| -* @param {object} root - The root of the tree |
| 137 | +* @param {MyNode} root - The root of the tree |
127 | 138 | * @param {number} value - The value to insert
|
| 139 | +* @returns {MyNode} |
128 | 140 | */
|
129 |
| -const findParentOfToBeDeletedNode = function(root, value){ |
130 |
| - let node = root; |
131 |
| - const cb = (root) => { |
132 |
| - if(root && ((root.right && root.right.value === value)||(root.left && root.left.value === value))) |
133 |
| - node = root; |
134 |
| - } |
135 |
| - traverse(root, cb) |
136 |
| - return node; |
137 |
| -} |
| 141 | +const findParentOfToBeDeletedNode = function( |
| 142 | + root: MyNode, |
| 143 | + value: number |
| 144 | +): MyNode { |
| 145 | + let node = root; |
| 146 | + const cb = root => { |
| 147 | + if ( |
| 148 | + root && |
| 149 | + ((root.right && root.right.value === value) || |
| 150 | + (root.left && root.left.value === value)) |
| 151 | + ) |
| 152 | + node = root; |
| 153 | + }; |
| 154 | + traverse(root, cb); |
| 155 | + return node; |
| 156 | +}; |
138 | 157 |
|
139 | 158 | /**
|
140 | 159 | * Delete a node from the tree
|
141 | 160 | *
|
142 |
| -* @param {object} root - The root of the tree |
| 161 | +* @param {MyNode} root - The root of the tree |
143 | 162 | * @param {number} value - The value to insert
|
144 | 163 | */
|
145 |
| -const deleteNode = function(root, value){ |
| 164 | +const deleteNode = function(root: MyNode, value: number) { |
146 | 165 | let parent = findParentOfToBeDeletedNode(root, value);
|
147 | 166 | let node = find(root, value);
|
148 | 167 |
|
149 | 168 | // leaves
|
150 |
| - if(node.left === undefined && node.right === undefined){ |
151 |
| - if(parent.left.value === node.value){ |
| 169 | + if (node.left === undefined && node.right === undefined) { |
| 170 | + if (parent.left.value === node.value) { |
152 | 171 | parent.left = undefined;
|
153 |
| - } else if(parent.right.value === node.value){ |
| 172 | + } else if (parent.right.value === node.value) { |
154 | 173 | parent.right = undefined;
|
155 | 174 | }
|
156 |
| - } // node with 1 child |
157 |
| - else if (node.left === undefined && node.right !== undefined){ |
| 175 | + } else if (node.left === undefined && node.right !== undefined) { |
| 176 | + // node with 1 child |
158 | 177 | parent.right = node.right;
|
159 |
| - } // node with 1 child |
160 |
| - else if (node.left !== undefined && node.right === undefined){ |
| 178 | + } else if (node.left !== undefined && node.right === undefined) { |
| 179 | + // node with 1 child |
161 | 180 | parent.left = node.left;
|
162 |
| - } // node with 2 children |
163 |
| - else if (node.left && node.right){ |
| 181 | + } else if (node.left && node.right) { |
| 182 | + // node with 2 children |
164 | 183 | // find the min in the subtree
|
165 | 184 | // and swap it with the value that would be deleted
|
166 | 185 | let min = node.left.value;
|
167 | 186 | let pointer = node;
|
168 |
| - while(pointer){ |
| 187 | + while (pointer) { |
169 | 188 | min = pointer.value;
|
170 |
| - pointer = pointer.left |
| 189 | + pointer = pointer.left; |
171 | 190 | }
|
172 | 191 | node.value = min;
|
173 | 192 |
|
174 | 193 | // Delete the dublicate
|
175 | 194 | pointer = node;
|
176 |
| - while(pointer){ |
177 |
| - if(pointer.left && pointer.left.value === min){ |
| 195 | + while (pointer) { |
| 196 | + if (pointer.left && pointer.left.value === min) { |
178 | 197 | pointer.left = undefined;
|
179 | 198 | }
|
180 |
| - pointer = pointer.left |
| 199 | + pointer = pointer.left; |
181 | 200 | }
|
182 |
| - |
183 | 201 | }
|
184 |
| -} |
185 |
| - |
| 202 | +}; |
186 | 203 | ```
|
0 commit comments