Skip to content

Commit be357f0

Browse files
committed
add dfs (deep first search) with 3 case (InOrder, PreOrder, PostOrder)
1 parent a837d97 commit be357f0

File tree

4 files changed

+114
-4
lines changed

4 files changed

+114
-4
lines changed
+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import { describe, expect, beforeEach, test } from 'bun:test'
2+
import { BinarySearchTree } from './bfs-dfs';
3+
4+
describe('BinarySearchTree', () => {
5+
let tree: BinarySearchTree;
6+
7+
beforeEach(() => {
8+
tree = new BinarySearchTree();
9+
// Insert nodes for testing
10+
tree.insert(9);
11+
tree.insert(4);
12+
tree.insert(6);
13+
tree.insert(20);
14+
tree.insert(170);
15+
tree.insert(15);
16+
tree.insert(1);
17+
});
18+
19+
test('breathFirstSearch should return values in breadth-first order', () => {
20+
const result = tree.breathFirstSearch();
21+
expect(result).toEqual([9, 4, 20, 1, 6, 15, 170]);
22+
});
23+
24+
test('breathFirstSearchRecursive should return values in breadth-first order', () => {
25+
const result = tree.breathFirstSearchRecursive([tree.root], []);
26+
expect(result).toEqual([9, 4, 20, 1, 6, 15, 170]);
27+
});
28+
29+
test('DFSInorder should return values in inorder traversal', () => {
30+
const result = tree.DFSInorder();
31+
expect(result).toEqual([1, 4, 6, 9, 15, 20, 170]);
32+
});
33+
34+
test('DFSPreorder should return values in preorder traversal', () => {
35+
const result = tree.DFSPreorder();
36+
expect(result).toEqual([9, 4, 1, 6, 20, 15, 170]);
37+
});
38+
39+
test('DFSPostorder should return values in postorder traversal', () => {
40+
const result = tree.DFSPostorder();
41+
expect(result).toEqual([1, 6, 4, 15, 170, 20, 9]);
42+
});
43+
});

src/algorithm/searching/breath-first-search.ts renamed to src/algorithm/searching/bfs-dfs.ts

+71-4
Original file line numberDiff line numberDiff line change
@@ -175,14 +175,78 @@ export class BinarySearchTree {
175175
// Recursive case
176176
return this.breathFirstSearchRecursive(queue, list)
177177
}
178+
179+
DFSInorder() {
180+
return this.traverseInOrder(this.root, [])
181+
}
182+
183+
DFSPreorder() {
184+
return this.traversePreOrder(this.root, [])
185+
}
186+
DFSPostorder() {
187+
return this.traversePostOrder(this.root, [])
188+
}
189+
190+
// 9
191+
// 4 20
192+
//1 6 15 170
193+
// InOrder - Left -> Root -> Right: [1, 4, 6, 9, 15, 20, 170]
194+
traverseInOrder(node: any, list: number[]) { // Đều sử dụng cấu trúc dữ liệu stack. Function nào gọi sau -> thì thực hiện trước!
195+
196+
console.log(node.value);
197+
console.log(list);
198+
// Recursive case:
199+
if (node.left) {
200+
this.traverseInOrder(node.left, list)
201+
}
202+
list.push(node.value)
203+
if (node.right) {
204+
this.traverseInOrder(node.right, list)
205+
}
206+
// Base case ?
207+
return list
208+
}
209+
210+
// PreOrder - Root -> Left -> Right: [9, 4, 1, 6, 20, 15, 170]
211+
traversePreOrder(node: any, list: number[]) { // Đều sử dụng cấu trúc dữ liệu stack. Function nào gọi sau -> thì thực hiện trước!
212+
console.log(node.value);
213+
console.log(list);
214+
list.push(node.value)
215+
// Recursive case:
216+
if (node.left) {
217+
this.traversePreOrder(node.left, list)
218+
}
219+
if (node.right) {
220+
this.traversePreOrder(node.right, list)
221+
}
222+
223+
// Base case ?
224+
return list
225+
}
226+
227+
traversePostOrder(node: any, list: number[]) { // Đều sử dụng cấu trúc dữ liệu stack. Function nào gọi sau -> thì thực hiện trước!
228+
console.log(node.value);
229+
console.log(list);
230+
// Recursive case:
231+
if (node.left) {
232+
this.traversePostOrder(node.left, list)
233+
}
234+
if (node.right) {
235+
this.traversePostOrder(node.right, list)
236+
}
237+
list.push(node.value)
238+
// Base case ?
239+
return list // Space complexity -> O(h) h: là chiều cao của cây nhị phân
240+
}
241+
178242
}
179243

180244
// 9
181245
// 4 20
182246
//1 6 15 170
183247
// InOrder - Left -> Root -> Right: [1, 4, 6, 9, 15, 20, 170]
184248
// PreOrder - Root -> Left -> Right: [9, 4, 1, 6, 20, 15, 170]
185-
// PostOrder - Left -> Right -> Root: [9, 15, 6, 20, 170, 1, 4]
249+
// PostOrder - Left -> Right -> Root: [1, 4, 6, 9, 15, 20, 170]
186250

187251
const tree = new BinarySearchTree();
188252
tree.insert(9);
@@ -192,11 +256,14 @@ tree.insert(20);
192256
tree.insert(170);
193257
tree.insert(15);
194258
tree.insert(1);
195-
tree.remove(170);
259+
// tree.remove(170);
196260
// JSON.stringify(traverse(tree.root));
197261
// console.log(tree.lookup(20));
198-
console.log(tree.breathFirstSearch());
199-
console.log(tree.breathFirstSearchRecursive([tree.root], []));
262+
// console.log(tree.breathFirstSearch());
263+
// console.log(tree.breathFirstSearchRecursive([tree.root], []));
264+
// console.log(tree.DFSInorder());
265+
// console.log(tree.DFSPreorder());
266+
console.log(tree.DFSPostorder());
200267
function traverse(node: Node | null) {
201268
if (!node) return null
202269
const tree: Node | null = { value: node.value, left: null, right: null };

src/algorithm/searching/validate-binary-search-tree.test.ts

Whitespace-only changes.

src/algorithm/searching/validate-binary-search-tree.ts

Whitespace-only changes.

0 commit comments

Comments
 (0)