Skip to content

Commit 88eb013

Browse files
committed
Merge branch 'js' into main with OOP refactor for normal challenges
2 parents 2238be5 + 455bf00 commit 88eb013

File tree

30 files changed

+1927
-0
lines changed

30 files changed

+1927
-0
lines changed
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
# Challenge Description and Solution
2+
3+
## English Version
4+
5+
### Challenge Description
6+
Implement a binary search tree (BST) that supports insertions, searches, and deletions. Test different traversals (in-order, pre-order, and post-order) to ensure the tree updates correctly.
7+
8+
### Code Explanation
9+
The BST is implemented with a `Node` class representing each node and a `BinarySearchTree` class managing the tree. The tree supports:
10+
- `insert(key)`: Inserts a key into the BST.
11+
- `search(key)`: Searches for a key in the BST.
12+
- `delete(key)`: Deletes a key from the BST.
13+
- Traversal methods: `inorder()`, `preorder()`, and `postorder()` return arrays of keys in respective traversal orders.
14+
15+
The deletion handles three cases:
16+
- Node with no children.
17+
- Node with one child.
18+
- Node with two children (replaces with inorder successor).
19+
20+
### Relevant Code Snippet
21+
22+
```javascript
23+
class BinarySearchTree {
24+
// ... class implementation as in bst.js ...
25+
}
26+
```
27+
28+
### Example Usage
29+
30+
```javascript
31+
const bst = new BinarySearchTree();
32+
[50, 30, 20, 40, 70, 60, 80].forEach(key => bst.insert(key));
33+
34+
console.log("Inorder traversal:");
35+
console.log(bst.inorder());
36+
37+
console.log("Preorder traversal:");
38+
console.log(bst.preorder());
39+
40+
console.log("Postorder traversal:");
41+
console.log(bst.postorder());
42+
43+
const key = 40;
44+
const found = bst.search(key);
45+
console.log(`Search for ${key}: ${found ? "Found" : "Not found"}`);
46+
47+
bst.delete(20);
48+
console.log("Inorder traversal after deleting 20:");
49+
console.log(bst.inorder());
50+
51+
bst.delete(30);
52+
console.log("Inorder traversal after deleting 30:");
53+
console.log(bst.inorder());
54+
55+
bst.delete(50);
56+
console.log("Inorder traversal after deleting 50:");
57+
console.log(bst.inorder());
58+
```
59+
60+
---
61+
62+
## Versión en Español
63+
64+
### Descripción del Reto
65+
Implementa un árbol binario de búsqueda (BST) que soporte inserciones, búsquedas y eliminaciones. Prueba diferentes recorridos (inorden, preorden y postorden) para asegurar que el árbol se actualice correctamente.
66+
67+
### Explicación del Código
68+
El BST se implementa con una clase `Node` que representa cada nodo y una clase `BinarySearchTree` que maneja el árbol. El árbol soporta:
69+
- `insert(key)`: Inserta una clave en el BST.
70+
- `search(key)`: Busca una clave en el BST.
71+
- `delete(key)`: Elimina una clave del BST.
72+
- Métodos de recorrido: `inorder()`, `preorder()` y `postorder()` que retornan arreglos de claves en los respectivos órdenes de recorrido.
73+
74+
La eliminación maneja tres casos:
75+
- Nodo sin hijos.
76+
- Nodo con un hijo.
77+
- Nodo con dos hijos (se reemplaza con el sucesor en inorden).
78+
79+
### Fragmento de Código Relevante
80+
81+
```javascript
82+
class BinarySearchTree {
83+
// ... implementación de la clase como en bst.js ...
84+
}
85+
```
86+
87+
### Ejemplo de Uso
88+
89+
```javascript
90+
const bst = new BinarySearchTree();
91+
[50, 30, 20, 40, 70, 60, 80].forEach(key => bst.insert(key));
92+
93+
console.log("Recorrido inorden:");
94+
console.log(bst.inorder());
95+
96+
console.log("Recorrido preorden:");
97+
console.log(bst.preorder());
98+
99+
console.log("Recorrido postorden:");
100+
console.log(bst.postorder());
101+
102+
const key = 40;
103+
const found = bst.search(key);
104+
console.log(`Búsqueda de ${key}: ${found ? "Encontrado" : "No encontrado"}`);
105+
106+
bst.delete(20);
107+
console.log("Recorrido inorden después de eliminar 20:");
108+
console.log(bst.inorder());
109+
110+
bst.delete(30);
111+
console.log("Recorrido inorden después de eliminar 30:");
112+
console.log(bst.inorder());
113+
114+
bst.delete(50);
115+
console.log("Recorrido inorden después de eliminar 50:");
116+
console.log(bst.inorder());
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
// bst.js - Binary Search Tree implementation
2+
3+
function Node(key) {
4+
this.key = key;
5+
this.left = null;
6+
this.right = null;
7+
}
8+
9+
class BinarySearchTree {
10+
constructor() {
11+
this.root = null;
12+
}
13+
14+
insert(key) {
15+
this.root = this._insertRec(this.root, key);
16+
}
17+
18+
_insertRec(node, key) {
19+
if (node === null) {
20+
return new Node(key);
21+
}
22+
if (key < node.key) {
23+
node.left = this._insertRec(node.left, key);
24+
} else {
25+
node.right = this._insertRec(node.right, key);
26+
}
27+
return node;
28+
}
29+
30+
search(key) {
31+
return this._searchRec(this.root, key);
32+
}
33+
34+
_searchRec(node, key) {
35+
if (node === null) return false;
36+
if (key === node.key) return true;
37+
if (key < node.key) return this._searchRec(node.left, key);
38+
else return this._searchRec(node.right, key);
39+
}
40+
41+
delete(key) {
42+
this.root = this._deleteRec(this.root, key);
43+
}
44+
45+
_deleteRec(node, key) {
46+
if (node === null) return null;
47+
48+
if (key < node.key) {
49+
node.left = this._deleteRec(node.left, key);
50+
} else if (key > node.key) {
51+
node.right = this._deleteRec(node.right, key);
52+
} else {
53+
if (node.left === null) return node.right;
54+
if (node.right === null) return node.left;
55+
56+
node.key = this._minValue(node.right);
57+
node.right = this._deleteRec(node.right, node.key);
58+
}
59+
return node;
60+
}
61+
62+
_minValue(node) {
63+
let current = node;
64+
while (current.left !== null) {
65+
current = current.left;
66+
}
67+
return current.key;
68+
}
69+
70+
inorder() {
71+
return this._traverse(this.root, []);
72+
}
73+
74+
preorder() {
75+
return this._traverse(this.root, [], "preorder");
76+
}
77+
78+
postorder() {
79+
return this._traverse(this.root, [], "postorder");
80+
}
81+
82+
_traverse(node, result, order = "inorder") {
83+
if (node === null) return result;
84+
85+
if (order === "preorder") result.push(node.key);
86+
this._traverse(node.left, result, order);
87+
if (order === "inorder") result.push(node.key);
88+
this._traverse(node.right, result, order);
89+
if (order === "postorder") result.push(node.key);
90+
91+
return result;
92+
}
93+
}
94+
95+
module.exports = { BinarySearchTree };
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/*
2+
Challenge: Implement a binary search tree (BST) that supports insertions, searches, and deletions.
3+
Test different traversals (in-order, pre-order, and post-order) to ensure the tree updates correctly.
4+
*/
5+
6+
// main.js - Example usage of BinarySearchTree
7+
8+
import { BinarySearchTree } from './bst.js';
9+
10+
function main() {
11+
const bst = new BinarySearchTree();
12+
[50, 30, 20, 40, 70, 60, 80].forEach((key) => bst.insert(key));
13+
14+
console.log("Inorder traversal:");
15+
console.log(bst.inorder());
16+
17+
console.log("Preorder traversal:");
18+
console.log(bst.preorder());
19+
20+
console.log("Postorder traversal:");
21+
console.log(bst.postorder());
22+
23+
const key = 40;
24+
const found = bst.search(key);
25+
console.log(`Search for ${key}: ${found ? "Found" : "Not found"}`);
26+
27+
bst.delete(20);
28+
console.log("Inorder traversal after deleting 20:");
29+
console.log(bst.inorder());
30+
31+
bst.delete(30);
32+
console.log("Inorder traversal after deleting 30:");
33+
console.log(bst.inorder());
34+
35+
bst.delete(50);
36+
console.log("Inorder traversal after deleting 50:");
37+
console.log(bst.inorder());
38+
}
39+
40+
main();

0 commit comments

Comments
 (0)